谈谈我对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编程起步(第四课)
Feb 27 Javascript
JavaScript While 循环基础教程
Apr 05 Javascript
用javascript动态调整iframe高度的代码
Apr 10 Javascript
js实现iframe动态调整高度的代码
Jan 06 Javascript
JavaScript判断DOM何时加载完毕的技巧
Nov 11 Javascript
javascript获取选中的文本的方法代码
Oct 30 Javascript
JS动画效果打开、关闭层的实现方法
May 09 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
js上下视差滚动简单实现代码
Mar 07 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 Javascript
Vue 打包后相对路径的引用问题
Jun 05 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
Smarty模板快速入门
2007/01/04 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
8个PHP数组面试题
2015/06/23 PHP
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
利用纯js + transition动画实现移动端web轮播图详解
2017/09/10 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
Django实现自定义404,500页面教程
2017/03/26 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
职业技术学校毕业生推荐信
2013/12/03 职场文书
护士自荐信范文
2013/12/15 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
社区科普工作方案
2014/06/03 职场文书
教师求职自荐书
2014/06/14 职场文书
化工专业求职信
2014/07/01 职场文书
学校施工安全责任书
2015/01/29 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书