谈谈我对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 相关文章推荐
javascript编程起步(第五课)
Jan 10 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
基于jquery中children()与find()的区别介绍
Apr 26 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
详解基于vue-cli配置移动端自适应
Jan 13 Javascript
基于Vue2x的图片预览插件的示例代码
May 14 Javascript
jQuery内容选择器与表单选择器实例分析
Jun 28 jQuery
详解ES6 Promise的生命周期和创建
Aug 18 Javascript
vue自定义switch开关组件,实现样式可自行更改
Nov 01 Javascript
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
详解vue身份认证管理和租户管理
May 25 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静态新闻列表自动生成代码
2007/06/14 PHP
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
js 文件引入实现代码
2010/04/23 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
跟老齐学Python之编写类之二方法
2014/10/11 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
2014年工作总结与下年工作计划
2014/11/27 职场文书
教师个人学习总结
2015/02/11 职场文书
审美与表现自我评价
2015/03/09 职场文书
青涩记忆观后感
2015/06/18 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
vue特效之翻牌动画
2022/04/20 Vue.js