在if语句中定义JavaScript变量是否正确?
if(a==1){
var b = 1;
} else {
var b = 0;
}
我知道上面的代码可行,但是,WebMatrix会突出显示变量。
我应该在if语句之外定义变量吗?或者第一个选项是正确的?或者它并不重要?
var b = '';
if(a==1){
b = 1;
} else {
b = 0;
}
答案 0 :(得分:55)
自ES2017规范(2017-07-08)正式发布以来,EcmaScript 确实现在使用let
或const
关键字支持真正的块范围。
由于ECMAscript没有阻止范围而功能范围,因此在函数上下文中声明任何变量是一个非常好的主意。
即使你可以在函数上下文中的任何一点进行变量和函数声明,但是如果你没有完全意识到后果,那就会引起一些奇怪的麻烦。
头痛示例:
var foo = 10;
function myfunc() {
if (foo > 0) {
var foo = 0;
alert('foo was greater than 0');
} else {
alert('wut?');
}
}
猜猜看,我们得到了什么?在此处致电myfunc
时发出提醒这是因为ECMAscript解释器会自动将提升任何var
语句和函数声明添加到上下文的顶部。基本上,foo
会在第一个undefined
之前初始化为if statement
。
答案 1 :(得分:2)
将var放在if语句中并不违反语言的“规则”,但这意味着,由于var提升,无论if语句的条件是否满足,都将定义var。
答案 2 :(得分:2)
请注意,ECMAscript 6确实使用'let'而不是'var'关键字来支持块级变量。虽然使用'var'声明的变量将被提升为函数范围,而不管它们在何处声明,但使用'let'定义的变量仅限于封闭块。
答案 3 :(得分:1)
请参阅What is the scope of variables in JavaScript?
上的功能four
截至2012年,JavaScript中没有块级范围。所以你的第一个版本没问题:变量是在if
块之外的范围内定义的。
答案 4 :(得分:1)
因为JavaScript的变量具有功能级范围,所以您的第一个示例是有效地重新声明您的变量,这可以解释为什么它会被突出显示。
在旧版本的Firefox上,其严格的JavaScript模式用于警告此重新声明,但其中一位开发人员抱怨说它的风格很局促,因此关闭了警告。 (当前版本的Firefox支持块级变量声明语法。)