作用域和作用域链
Posted 纸 飞机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域和作用域链相关的知识,希望对你有一定的参考价值。
作用域
对变量和函数起隔离保护作用的一块区域,是一个标识符(变量与函数)在代码中的可访问范围,作用域控制着变量与函数的可见性和生命周期。作用域内部能够获取到作用域外部声明的变量,而作用域外部无法获取到作用域内部声明的变量。不同作用域下同名变量不会有冲突。
全局作用域:
其变量和对象在程序的任何地方都能被访问。以下变量和对象在全局作用域。
1.最外层的函数和在最外层定义的变量。
2.所有有末定义直接赋值的变量。
3.window 对象的内置属性。
函数作用域:
函数内部,声明在函数内部的变量只能被内部代码访问。
ES6块级作用域:
在一个代码块(由一对花括号包裹内部用),用let 或 const 声明变量,其作用域限制在当前代码块中。
作用域链
各个作用域的嵌套关系组成了一条作用域链,作用域链主要是为了标识符的查询,先到创建这个变量的函数的作用域中取值,如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这个查找过程形成的一层一层的关系链就叫做作用域链。
深入理解
1、作用域是确定标识符访问范围以及查 找的一套规则,是抽象说法。其实质是执行上下文中与其绑定的变量对象以及由变量对象的指针组成的列表。
2、程序运行时,会创建相关的执行上下文(execution context,也叫执行环境或环境 ) , 分全局执 行环境和函数执行环境。每个环境都有一个与之关联的变量对象(variable object, VO),该环境中定义 的所有变量和函数都保存在这个对象中。 这个对象只能js引擎访问。
3、全局执行环境是最外围也是最先创建 并进入的一个执行环境,其变量对象叫全局对象 (Global ,Object , GO ) ,等于window , 所以全局的变量和函数都是window的属性和方法。
4、每个函数调用时也会创建自己的执行环境,其变量对象(代码执行后又叫活动对象Activation Object, AO)保存函数内部的变量和方法。
5、这些执行环境均保存在执行栈 (Execution Stack)中。最先入栈的是全局环境,当执行流进入一个函数时,函数的环境就会被推入栈中。当函数执行完毕后,栈将其环境弹出并销毁,把控制权返 回给之前的执行环境继续执行流,全局执行环境直到程序退出(关闭网页或浏览器) 时才销毁。
6、函数执行环境创建时其内部属性[[Scope]]中会保存一组有序的指针列表,列表的最前端,是当前执行环境的变量对象,下一个是外部(包含)环境的变量对象,这样一直向外部延续,最后一个始 终是全局对象window。这组链式的列表 就是作用域链(Scope Chain)。具体过程 是创建环境时先复制父级的scope属性到 当前环境下以初始化作用域链,然后将当 前的变量对象推入作用域链的最前面。
7、执行时js引擎从作用域链scope最前端 开始搜索变量名,找不到就逐步向后查 找,沿着作用域链一级一级搜索,直到找到为止,或者报错。
以上是关于作用域和作用域链的主要内容,如果未能解决你的问题,请参考以下文章