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
,然后等等。
ExecutionContext Object
在我的功能环境中会是什么样子。答案 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);
})();
以下几页将明确指出: