对于下面的代码,正如我已经重新声明a
的那样var a
,我的期望alert(a)
是显示undefined
,但为什么显示4
?
function f(a) {
var a;
alert(a);
}
f(4);
在JavaScript中,变量是函数的全局变量或本地变量.函数中没有嵌套作用域(除非你实际上将一个函数嵌套在另一个函数中).
引用Mozilla的JavaScript文档:
用var声明的变量的范围是它的当前执行上下文,它是封闭函数,或者对于在任何函数外部声明的变量,是全局的.
由于函数参数a
和您的函数var a
都在同一函数作用域中声明,因此它们将解析为同一个变量.
另请参见:JavaScript中的变量范围是什么?
请注意,对象字段也可以被视为另一个范围的范围 - 但这与您的问题并不真正相关.
另外 - 正如torazaburo在下面的评论中指出的那样 - ECMAScript 6引入了一个let
关键字,它允许您在函数中创建真正的嵌套范围.但是,这个功能是新的,我原本不认为值得一提(因为它在生产代码中使用它并不是真的安全).例如,看起来Firefox let
在本月底(2016年1月)发布新版本之前不会正式支持新版本.
声明在称为提升的过程中移动到其范围的顶部.
例如:
var a = 5; var a = 6; var a;
变得像
var a = undefined; a = 5; a = 6; a;
因此,尝试重新声明已声明的变量而不使用任何赋值不会产生任何效果.
在您的情况下,该变量a
已被声明为函数的参数.所以var a;
没用.如果要将其设置为undefined,请使用a = void 0;
.