重新定义变量不成功
Posted
技术标签:
【中文标题】重新定义变量不成功【英文标题】:Redefined variable not success 【发布时间】:2016-04-15 06:47:35 【问题描述】:对于下面的代码,因为我已经用var a
重新声明了a
,所以我对alert(a)
的期望是显示undefined
,但为什么它显示4
?
function f(a)
var a;
alert(a);
f(4);
【问题讨论】:
jslint 或其他 linter 会报错如“Redefinition ofa
:,
另外,如果你使用let
而不是var
,解释器(或转译器)本身会产生一个有用的错误。
你的标题很误导人,你没有在这里重新定义变量
【参考方案1】:
在 javascript 中,变量要么是全局的,要么是函数的局部。函数内没有嵌套作用域之类的东西(除非您实际上将一个函数嵌套在另一个函数中)。
引用 Mozilla 的 JavaScript 文档:
The scope of a variable declared with var is its current execution context, which is either the enclosing function or, for variables declared outside any function, global.
由于函数参数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)。
【讨论】:
函数中没有嵌套作用域这种东西但是let
呢?
@torazaburo - 好点。但是,由于 let
去年才刚刚标准化,因此在没有 jumping through hoops 的情况下在野外真正安全使用可能还需要一段时间。【参考方案2】:
声明在称为提升的过程中移至其范围的顶部。
例如:
var a = 5;
var a = 6;
var a;
变成类似
var a = undefined;
a = 5;
a = 6;
a;
因此,尝试在不使用任何赋值的情况下重新声明一个已声明的变量没有任何作用。
在您的情况下,变量 a
已被声明为函数的参数。所以var a;
没用。如果要将其设置为未定义,请使用a = void 0;
。
【讨论】:
我不明白--这里的吊装有什么意义? @torazaburo 当一个变量用var a;
声明时,它的值将是未定义的。但是由于提升,声明被移到顶部,因此无法重新声明变量。至少我是这么理解的。以上是关于重新定义变量不成功的主要内容,如果未能解决你的问题,请参考以下文章