在这个例子中
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什么区别?
感谢您提前启发我!
该inner函数在变量实例化过程执行匿名函数之前创建.
在[[Scope]]中inner时,它的执行包含:
inner(它是空的,因为里面没有变量/函数声明)x,y和inner.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声明,但第二部分是关于功能的.
函数内部何时被创建?在外部匿名函数的执行时间或解析时间?
每次执行外部函数时都会创建一个.
函数内部的范围链是什么?
当你执行它时,该执行获得一个变量对象(从技术上讲,规范称之为"变量环境的绑定对象"); 由为创建的外部函数调用创建的变量对象支持inner; 这是由全局变量对象支持的.所以:
+------------------------------+
| global variable obj |
+------------------------------+
^
|
+-----------------------------+
| variable obj for outer call |
+-----------------------------+
^
|
+-----------------------------+
| variable obj for inner call |
+-----------------------------+
函数内部的执行上下文是什么?
每个函数调用都有自己的执行上下文.我不太清楚我明白这里有什么问题.
您可以对所有的这些东西读了(如果你愿意通过肿胀散文的糖浆涉水)在第10条规范,特别是第10.4.3节:"输入功能代码".