谈谈我对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 相关文章推荐
jQuery实现新消息在网页标题闪烁提示
Jun 23 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
Bootstrap模态窗口源码解析
Feb 08 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
Dec 24 Javascript
javascript与PHP动态往类中添加方法对比
Mar 21 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
js for终止循环 跳出多层循环
Oct 04 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
js实现简单五子棋游戏
May 28 Javascript
vue使用exif获取图片经纬度的示例代码
Dec 11 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-fpm配置详解
2014/02/12 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
Python中super()函数简介及用法分享
2016/07/11 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python代码如何注释
2020/06/01 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
优秀团队获奖感言
2014/02/19 职场文书
招标授权委托书样本
2014/09/23 职场文书
会计入职心得体会
2016/01/22 职场文书