谈谈我对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的内存管理详解
Aug 07 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
Node.js的Express框架使用上手指南
Mar 12 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
Aug 02 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
Oct 19 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
原生jQuery实现只显示年份下拉框
Dec 24 jQuery
基于JavaScript实现轮播图效果
Jan 02 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求两个文件的相对路径
2013/06/20 PHP
php curl模拟post请求小实例
2013/11/13 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Python简易版图书管理系统
2019/08/12 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
护士试用期自我鉴定
2014/02/08 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
鸦片战争观后感
2015/06/09 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL