1
var currentScope = 0;
(function(){
    var currentScope = 1, one= 'scope1';
    alert(currentScope);
  (function(){
    var currentScope = 2, two= 'scope2';
    alert(currentScope);
    alert(one + two);
  })();
})();

现在,当我在 jsbin 中执行此代码时,我会收到警报1 then 2,然后scope 1 and scope 2. 但我开始知道在 中ExecutionContext,它实际上会首先调用内部函数,然后查找outer variablethen 等等。

  1. 谁能告诉我ExecutionContext Object在我的功能环境中会是什么样子。
  2. 如果我错了,请纠正我,在浏览器中它会首先显示 currentScope 1,然后是 CurrentScope 2。但实际上在解释器的幕后,反之亦然。
4

1 回答 1

2

您案例中的代码以正确的顺序提醒值。我相信您对将函数声明提升到堆栈顶部感到困惑,因此甚至在它们实际出现在代码中之前就可以调用它们。但是在您的情况下,它们是匿名的立即执行函数表达式,而不是函数声明。函数表达式在原地求值(像任何其他函数代码一样解释),而不是事先提升或使其可用 - 因此将按照它们在代码中出现的顺序执行。

我希望下面的例子能进一步阐明它。

foo(); // foo is callable since its declaration was hoisted
function foo() { // this declaration is "hoisted" to the top of the execution
   ...
}

foo(); // this will cause error
var foo = function() { .. }; // function expression, no hoisting

var x = 5;
(function() { // function expression, no hoisting
    // will alert 5, since it was interpreted in-place
    // and executed after the "var x = 5" statement
    alert(x); 
})();

以下页面将清楚地说明:

于 2012-12-29T02:48:52.083 回答