谈谈我对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插件开发的两种方法及$.fn.extend的详解
Jan 16 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
jquery实现input框获取焦点的简单实例
Jan 26 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
JavaScript门道之标准库
May 26 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
js类的继承定义与用法分析
Jun 21 Javascript
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
原生js实现购物车
Sep 23 Javascript
全面解析Vue中的$nextTick
Dec 24 Vue.js
一起深入理解js中的事件对象
Feb 06 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格式化时间戳
2016/12/17 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python爬取m3u8连接的视频
2018/02/28 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python图形用户接口实例详解
2019/12/16 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
致800米运动员广播稿
2014/02/16 职场文书
教堂婚礼主持词
2014/03/14 职场文书
社会工作专业自荐信
2014/09/26 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
教师考核表个人总结
2015/02/12 职场文书
心灵点滴观后感
2015/06/02 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
教师培训学习心得体会
2016/01/21 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
Java如何实现树的同构?
2021/06/22 Java/Android
Python中super().__init__()测试以及理解
2021/12/06 Python
关于vue-router-link选择样式设置
2022/04/30 Vue.js
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技