JavaScript内部函数范围链?

nan*_*din 7 javascript scope

在这个例子中

var a = 1;
( function(x) {   
   function inner() {
      alert(a);
      alert(x);
      alert(y); 
   }
   var y = 3;
   inner();
})(2);
Run Code Online (Sandbox Code Playgroud)

什么时候function inner创建?在外部匿名函数的执行时间或解析时间?

什么是范围链function inner

执行上下文和范围链有function inner什么区别?

感谢您提前启发我!

CMS*_*CMS 9

inner函数在变量实例化过程执行匿名函数之前创建.

[[Scope]]inner时,它的执行包含:

  1. 空的变量对象inner(它是空的,因为里面没有变量/函数声明)
  2. 匿名函数,它包含的变量对象x,yinner.
  3. 全局对象,包含a和其他属性......
    Global (3)          Anonymous VO (2)       inner VO (1)
   ________              ________              ________
  | a = 1  | <--------- | x = 2  | < -------- |        |
  | ...    |            | y = 3  |             ¯¯¯¯¯¯¯¯ 
   ¯¯¯¯¯¯¯¯             | inner  |
                         ¯¯¯¯¯¯¯¯ 

编辑:澄清您的第二个问题:

函数内部的执行上下文和范围链有什么区别?

是两个不同的概念,执行上下文是在一段代码(可以是全局代码,函数代码或eval代码)之前创建的.

我认为使用您的代码可能更容易解释:

var a = 1;
(function(x) {        // Step 1
   function inner() {
      alert(a);
      alert(x);
      alert(y); 
   }
   var y = 3;
   inner();           // Step 3
})(2);                // Step 2
Run Code Online (Sandbox Code Playgroud)

步骤1中,创建匿名函数,当前作用域(仅包含全局对象)此时存储在函数[[Scope]]属性中.

步骤2中,执行此匿名函数,创建新的执行上下文(函数代码执行上下文),此时创建新的词法环境(创建此函数的变量对象),所有函数参数标识符(仅在这种情况下x),函数声明(inner)的标识符和变量声明(y)的标识符被绑定为此新变量对象(这是新的词法范围)的不可删除属性.

第3步inner执行功能,这将创建一个新的执行环境,另一个变量对象注入到作用域链,但在这种情况下,因为没有声明中inner,并没有任何正式的参数,这将只是一个空对象.

另见这个答案,第一部分我谈的是with声明,但第二部分是关于功能的.


T.J*_*der 7

函数内部何时被创建?在外部匿名函数的执行时间或解析时间?

每次执行外部函数时都会创建一个.

函数内部的范围链是什么?

当你执行它时,该执行获得一个变量对象(从技术上讲,规范称之为"变量环境的绑定对象"); 由为创建的外部函数调用创建的变量对象支持inner; 这是由全局变量对象支持的.所以:

+------------------------------+
| global variable obj          |
+------------------------------+
    ^
    |
   +-----------------------------+
   | variable obj for outer call |
   +-----------------------------+
       ^
       |
      +-----------------------------+
      | variable obj for inner call |
      +-----------------------------+

函数内部的执行上下文是什么?

每个函数调用都有自己的执行上下文.我不太清楚我明白这里有什么问题.

您可以对所有的这些东西读了(如果你愿意通过肿胀散文的糖浆涉水)在第10条规范,特别是第10.4.3节:"输入功能代码".