javascript中的作用域链和[[Scope]]
现在,当我在jsbin中执行此代码时,我得到的警报是javascript中的作用域链和[[Scope]],javascript,Javascript,现在,当我在jsbin中执行此代码时,我得到的警报是1,然后是scope 1和scope 2。但是我知道在ExecutionContext中,它实际上会首先调用内部函数,该函数将查找外部变量,然后依此类推 有人能告诉我在我的函数环境中,ExecutionContext对象是什么样子的吗 如果我错了,请更正,在浏览器中,它将首先显示currentScope 1,然后显示currentScope 2。但实际上,在解释器的幕后,情况正好相反 您案例中的代码以正确的顺序警告值。我相信您对将函数声明提升到
1,然后是scope 1和scope 2
。但是我知道在ExecutionContext
中,它实际上会首先调用内部函数,该函数将查找外部变量
,然后依此类推
有人能告诉我在我的函数环境中,ExecutionContext对象
是什么样子的吗
如果我错了,请更正,在浏览器中,它将首先显示currentScope 1,然后显示currentScope 2。但实际上,在解释器的幕后,情况正好相反
您案例中的代码以正确的顺序警告值。我相信您对将函数声明提升到堆栈顶部感到困惑,这样即使在它们实际出现在代码中之前,调用它们也是可能的。但在您的例子中,它们是匿名的,立即执行函数表达式,而不是函数声明。函数表达式是就地求值的(与任何其他函数代码一样进行解释),并且不会被提升或提前提供,因此将按照它们在代码中出现的顺序执行
我希望下面的例子能够在一定程度上澄清这一点
var currentScope = 0;
(function(){
var currentScope = 1, one= 'scope1';
alert(currentScope);
(function(){
var currentScope = 2, two= 'scope2';
alert(currentScope);
alert(one + two);
})();
})();
以下几页将说明这一点:
currentScope的变量阴影在这两种情况下都是在使用前立即设置的,因此这是一个令人费解的问题。(但不是,观察到的结果表明了它是如何工作的。如果引擎/解释器的工作方式不同,结果也会不同。)您认为内部函数首先被调用的原因是什么?它实际上是从外部函数调用的,就在警报之后。语句“它实际上会首先调用内部函数,然后再查找外部变量”和“但实际上在解释器的幕后,情况正好相反。”让我这么想。我给了+1。然而,虽然我不太清楚OP想要说什么,但我不相信吊装与这种行为有任何关系;可能是对调用函数意味着什么感到困惑。。在同一个调用站点调用一个被提升的函数也会产生同样的效果。@pst-在他的特定示例中,是的,因为他完全是在处理立即分配的局部变量。
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);
})();