谈谈我对JavaScript原型和闭包系列理解(随手笔记9)


Posted in Javascript onDecember 24, 2015

相关阅读:谈谈我对JavaScript原型和闭包系列理解(随手笔记6)   谈谈我对JavaScript原型和闭包系列理解(随手笔记8)

作用域

引用《JavaScript语言精粹和编程实践》上对作用域的定义:

变量作用域又叫变量的可见性。变量作用域完成对信息的隐蔽,也就是处理“割据”问题。

js中是没有块级作用域的(ES6中有一个let,可以在{},if,for里面声明,同时作用域限定在块级。let声明的变量不存在变量提升!这里不谈论这个,因为我也是偶然看到。)。

我们在编写代码的时候,不要在“块”里面声明变量,应该在代码的一开始就声明好,以避免发生歧义。

for(var i = 0; i < 10; i++) { //不好的声明方式
 //...
}
console.log(i);
/*----------------------------------------------*/
var i = 0; //好的声明方式
for(i = 0; i < 10; i++) {
 //....
}
console.log(i);

javascript除了全局作用域之外,还有一个函数作用域。

 我们在声明变量的时候,全局代码在最前端声明,函数中声明变量要在函数体前面声明。同时,声明变量的时候必须用"var"操作符。

var a = 10,  //全局作用域
 b = 20;
function fn() { //fn函数作用域
 var a = 100,
  c = 300;
 function bar() { //bar函数作用域
  var a = 1000,
   d = 4000;
 }
}

全局代码、fn函数和bar函数都会形成一个作用域。作用域有上下级关系,上下级关系是看函数在哪个作用域下创建的。fn函数作用域下创建了bar函数,"fn函数作用域"就是"bar函数的作用域"的上级。

作用域的最大用处就是隔离变量,不同作用域下同名变量不会有冲突

--------------------------------------------------------------------------------

作用域在函数定义的时候就已经确定了,而不是函数调用的时候确定。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

1、程序在加载的时候就已经确定了全局上下文环境,并随着程序的执行而对变量就行赋值。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

2、执行到36行,调用fn(10),创建fn函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

3、执行到32行,调用bar(100),创建bar(100)函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

4、bar(100)调用完毕,出栈,bar(100)函数上下文环境被销毁。接着执行33行,调用bar(200),创建bar(200)函数的执行上下文环境,压栈,并将此上下文设置为活动状态。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

5、bar(200)调用完毕,出栈,其上下文环境被销毁。此时的控制权交给了fn(10)上下文环境,其再次变为活动状态。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

6、此时fn(10)调用完毕,出栈,其上下文环境被销毁。控制权交给了全局执行上下文环境。

 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

到这里这一段代码的执行过程就跑完了。

然后借用一下原作者的完整图:

谈谈我对JavaScript原型和闭包系列理解(随手笔记9)

总结:

作用域只是一个“地盘”,要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。所以,如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。

Javascript 相关文章推荐
Valerio 发布了 Mootools
Sep 23 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
JQuery写动态树示例代码
Jul 31 Javascript
jQuery实现表格行上移下移和置顶的方法
May 22 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
javascript高仿热血传奇游戏实现代码
Feb 22 Javascript
深入浅析Node环境和浏览器的区别
Aug 14 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 Javascript
解决Vue watch里调用方法的坑
Nov 07 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 Javascript
Vue router配置与使用分析讲解
Dec 24 Vue.js
JQuery实现Ajax加载图片的方法
Dec 24 #Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
Dec 24 #Javascript
js中flexible.js实现淘宝弹性布局方案
Jun 23 #Javascript
正则表达式优化JSON字符串的技巧
Dec 24 #Javascript
jQuery实现移动端滑块拖动选择数字效果
Dec 24 #Javascript
不得不分享的JavaScript常用方法函数集(上)
Dec 23 #Javascript
JQuery实现的按钮倒计时效果
Dec 23 #Javascript
You might like
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
如何利用Python写个坦克大战
2020/11/18 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
学校安全检查制度
2014/01/27 职场文书
教师校本培训方案
2014/02/26 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
土地转让协议书
2014/09/27 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android