谈谈我对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 脚本将当地时间转换成其它时区
Mar 19 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
Sep 17 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
bootstrap data与jquery .data
Jul 07 Javascript
javascript面向对象之this关键词用法分析
Jan 13 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
Mar 21 Javascript
JS经典正则表达式笔试题汇总
Dec 15 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
bootstrap实现的自适应页面简单应用示例
Mar 09 Javascript
基于vue2.0实现简单轮播图
Nov 27 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
js检测用户输入密码强度
2015/10/22 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
会议活动邀请函
2014/01/27 职场文书
销售人员获奖感言
2014/02/05 职场文书
美术教师岗位职责
2014/03/18 职场文书
白岩松演讲
2014/05/21 职场文书
亚运会口号
2014/06/20 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
意向协议书
2015/01/27 职场文书
golang 语言中错误处理机制
2021/08/30 Golang
Win11开始菜单添加休眠选项
2022/04/19 数码科技