JS中的作用域链是在啥时候建立的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中的作用域链是在啥时候建立的相关的知识,希望对你有一定的参考价值。

执行上下文

每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.
执行上下文是个抽象概念,标准中没有从技术实现上定义执行上下文的具体结构和类型.
就是一系列活动的执行上下文从逻辑上形成一个栈(比较抽象).
栈底总是全局上下文,栈顶是当前(活动的)执行上下文.
当在不同的执行上下文间切换(退出而进入新的执行上下文)的时候,栈会被修改(通过压栈或者出栈的形式).

变量对象
执行上下文的数据是以变量对象的属性形式进行存储的.

一个变量对象(简写为VO)是一个和执行上下文相关的特别对象,存储以下内容:
变量(声明的变量,var)
函数声明(简写为FD)
在上下文中,函数声明的形式参数

作用域链

作用域链是一条变量对象的链,它和执行上下文有关,用于在处理标识符的时候进行变量查询.
函数上下文的作用域链在函数调用的时候创建出来,它包含了活跃对象和该函数的内部[[Scope]]属性.

执行上下文变量大致如下:
activeExecutionContext =
VO:...,//或者AO
this:thisValue,
Scope:[
//作用域链,所有变量对象的列表,用来查询标识符
]


上面Scope可以定义如下:
Scope = AO+[[Scope]]
可以用数组进行表示:
var Scope = [VO1,VO2,...,VOn];//作用域链
参考技术A javascript高级程序设计(第4版):上下文中的代码在执行的时候,会创建变量对象的一个作用域链( scope chain)
JavaScript高级程序设计(第3版):当代码在一个环境中执行时,会创建变量对象的一个作用域链( scope chain)。
但是网上大部分博客都是说 在创建的时候就确定了scope chain。我觉得 还是以书为准吧本回答被提问者采纳

js 词法作用域揭秘

先看段代码:

//词法作用域
var scope = "global";
function fn1(){
    console.log(scope);
}
function fn2(){
    var scope = "local";
    fn1();
}
fn2();    

结果是global

为什么呢?

js是采用词法作用域,即静态作用域。

JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。fn1调用fn2,fn2 的作用域链按照书写的位置查找,其中的变量 scope 一定是全部变量,不管何时何地执行函数 fn1(),打印的都是全局的“global”。

 

以上是关于JS中的作用域链是在啥时候建立的的主要内容,如果未能解决你的问题,请参考以下文章

js中级-作用域链

JS的作用域链与原型链

js基础梳理-如何理解作用域和作用域链?

js中的作用域和作用域链

js中的作用域链

js之认识闭包