对于以下代码,因为我已使用a
重新声明var a
,我对alert(a)
的期望是显示undefined
,但为什么显示4
?
function f(a) {
var a;
alert(a);
}
f(4);

答案 0 :(得分:9)
在JavaScript中,变量是全局或函数的本地。函数中没有嵌套作用域(除非你实际上将一个函数嵌套在另一个函数中)。
引用Mozilla的JavaScript文档:
由于函数参数a
和var a
都在同一函数范围内声明,因此它们会解析为同一个变量。
另请参阅:What is the scope of variables in JavaScript?
请注意,对象字段也可以被视为另一个范围的范围 - 但这与您的问题无关。
另外 - 正如torazaburo在下面的评论中指出的那样 - ECMAScript 6 introduced a let
keyword,它允许你在函数中创建真正的嵌套作用域。但是,这个功能是新的,我原本不认为值得一提(因为它在生产代码中使用它并不是真的安全)。例如,它看起来像Firefox won't officially support the new let
construct until their new release at the end of this month (January 2016)。
答案 1 :(得分:6)
声明在名为hoisting的过程中移动到其范围的顶部。
例如:
var a = 5;
var a = 6;
var a;
变得类似
var a = undefined;
a = 5;
a = 6;
a;
因此,在不使用任何赋值的情况下尝试重新声明已声明的变量不会产生任何效果。
在您的情况下,变量a
已经被声明为函数的参数。所以var a;
没用。如果要将其设置为未定义,请使用a = void 0;
。