也许这很愚蠢,但我真的对'var'关键字感到沮丧。我无法弄清楚以下问题:
var local = true;
function outer() {
/* local scope */
var local = false;
function inner() {
alert(local);
var local;
}
inner();
}
outer();
function a(x) {
return x * 2;
}
var a;
alert(a);
感谢任何解释。
答案 0 :(得分:2)
带注释的来源;我假设这段代码从全局范围开始:
var local = true; // Creates a global variable called `local`
function outer() {
/* local scope */
var local = false; // Creates a local `local` within `outer`, shadowing (hiding) the global
function inner() {
alert(local); // alerts "undefined", the value of `inner`'s `local`
var local; // Creates a local `local` within `inner`, shadowing (hiding) `outer`'s version
}
inner();
}
outer();
function a(x) { // Creates a global function `a`
return x * 2;
}
var a; // Has no effect
alert(a); // alerts the function source (on engines that have it)
上面的代码基本上有三件事情可以解决:
嵌套作用域中的声明在包含作用域中隐藏(隐藏)声明。因此,local
中的outer
会影响全局,local
隐藏inner
阴影outer
的{{1}}。
local
声明在执行进入执行上下文时被处理,不它们出现在源代码中。它们有时被称为“悬挂”,因为它们被有效地向上移动(抬起,悬挂)到它们发生的上下文的顶部。 (更多:Poor misunderstood var
)此效果在var
函数中尤为明显,因为被提醒的inner
是来自local
的{1}},而不是来自inner
的{{1}} }(这就是为什么它是outer
),即使声明在警报下面。
函数声明在与undefined
声明相同的符号空间中,在定义它们的作用域中创建符号。 (具体来说,它们都在执行上下文的词汇环境的绑定对象中创建条目。)所以如果你有函数声明和var
具有相同的名称(与代码末尾的var
一样),存在冲突。哪个胜利?函数声明胜出,因为§10.5 of the specification指示的顺序表示函数声明发生在a
声明之前,并且已定义的符号的var
不会覆盖它