JS 执行环境与作用域链
1、执行环境
JavaScript 代码都是在执行环境中被执行的。执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域、生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为。每个执行环境都有一个变量对象(我理解为环境变量对象),在代码执行环境中所有的变量、函数都保存在这个对象中;
全局的执行环境是最外围的执行环境,根据ECMAScript 实现所在的宿主环境同,表示执行环境的对象也不一样,在WEB浏览器中,全局执行环境被认为是Windows对象,因此所有全局变量、函数都是作为Windows 对象的属性、方法创建的,即全局执行环境生命周期直到应用程序退出或者网页关闭才被销毁;
局部执行环境是函数的执行环境,当执行流进入函数时,函数的环境被推入一个环境栈中,而在函数执行完之后,栈将其环境弹出,把控制权返回之前的执行环境,即函数执行完之后该环境下的变量、函数被销毁;
2、作用域链
当代码在一个环境中被执行时,会为变量对象创建一个作用域链对象,该作用域链对象最开始始终都是当前执行的代码所在的变量对象,如果这个环境是函数,则将其活动对象(activation object)作为变量对象,活动对象在最开始时只包含一个变量,即 argumengts 对象。作用域链中的下一个变量对象来做包含(外部),而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境(全局的变量对象),全局执行环境的变量对象始终都是作用连中的最后一个对象;如图:

如果该个环境是函数,则将其活动对象(activation object)作为变量对象,活动对象在最开始时只包含一个变量,即 argumengts 对象。
现在在来看作用域链的用途:保证对执行环境有全访问的所有变量和函数的有序访问,如果在作用域链中找不到就会报错(underfine)
2.1 没有快级作用域
if(true){
var color="blue";
}
alert(color);//blue
如果是强类型语言(c#/java/c/c++等)会报错,但是在js 中会把if语句中声明的变量添加到当前得执行环境中;
备注:以上内容在高级程序设计P73中说的很明白。
JS 执行环境与作用域链的更多相关文章
- JS执行环境,作用域链及非块状作用域
JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...
- JavaScript之一: 闭包、执行环境、作用域链
这是大虾的第一篇博文,大虾试图用最直白的语言去描述出所理解的东西,大虾是菜鸟,水平有限,有误的地方希望路过的朋友们务必指正,谢谢大家了. 从读书时代一路走来,大虾在学习的时候逐渐喜欢上了去追寻根源,这 ...
- javaScript执行环境、作用域链与闭包
一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...
- VO、AO、执行环境和作用域链
1.变量对象(variable object) 原文:Every execution context has associated with it a variable object. Variabl ...
- js执行环境、作用域
js执行环境.作用域 执行环境:是javascript中的一个重要的概念,<javascript高级程序设计第三版>的定义是:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行 ...
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- Javascript执行环境、作用域链
执行环境 可以把执行环境想象为一个圆圈,里面包含了一些变量.函数. 执行环境定义了变量或函数的有权访问的其他数据,决定了它们各自的行为.还有一个顶部执行环境.在浏览器中,顶部执行环境既为window, ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
随机推荐
- Eclipse c++环境搭建 并加载OpenCV库 2015最新
C++: 搜索 Eclipse c++ 即可 注意新版的mingw安装器,要安装: 1.mingw-developer-toolkit 2.mingw32-base 3.mingw32-gcc-g++ ...
- struts 中 s:iterator 使用注意事项
后台定义类 public class Course_pj { private String _id; private String _courseid; private String _course_ ...
- 脚本乐园 Shell中命令行选项和参数的处理
在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...
- Linux makefile教程之总述二[转]
Makefile 总述——————— 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或 ...
- 小结JS中的OOP(上)
前言:大家都知道,OOP有三大特性:封装,继承,多态.下面是自己对这三个特性的理解: 封装:把属性与方法整合到某种数据类型中.目的是让类的使用者按类的编写者的意愿去使用类.在封装过程中会一般会做两件事 ...
- .net core 中的序列化和反序列化
学习博客:http://www.voidcn.com/blog/dujingjing1230/article/p-1204454.html
- android操作文件
Android中读取/写入文件的方法,与Java中的I/O是一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件.但是在默认状态下,文件是不能在不同的程 ...
- Range类中的三个方法及简单打印
package pkgFirst; import org.junit.Test; public class Range{ /** * FunName: println * Description : ...
- 2016年JavaScript技术栈展望
如果你正在筹划新的前端项目或者重构现有项目,那么你需要认识到现在的前端开发环境已经今非昔比,这其中有太多的选择了:React.Flux.Angular.Aurelia.Mocha.Jasmine.Ba ...
- 查找指定目录下的文件 .xml
pre{ line-height:1; color:#9f1d66; background-color:#cfe4e4; font-size:16px;}.sysFunc{color:#5d57ff; ...