谈谈我对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 相关文章推荐
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
全面理解JavaScript中的继承(必看)
Jun 16 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
Feb 03 Javascript
JavaScript之Canvas_动力节点Java学院整理
Jul 04 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
BootStrap table实现表格行拖拽效果
Dec 01 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
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中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
php修改数组键名的方法示例
2017/04/15 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python实现图像识别功能
2018/01/29 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
优秀老员工获奖感言
2014/02/15 职场文书
公司晚会主持词
2014/03/22 职场文书
公司合作协议书范本
2014/04/18 职场文书
班级文化建设标语
2014/06/23 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
2014年司机工作总结
2014/11/21 职场文书
基石观后感
2015/06/12 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript