范围链和[[范围]]在javascript中

时间:2012-12-29 02:20:44

标签: javascript

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 variable,然后等等。

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

1 个答案:

答案 0 :(得分: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); 
})();

以下几页将明确指出: