在if语句中定义JavaScript变量

问题描述 投票:38回答:5

在if语句中定义JavaScript变量是否正确?

if(a==1){
    var b = 1;
} else {
    var b = 0;
}

我知道上面的代码可行,但是,WebMatrix强调了变量。

我应该在if语句之外定义变量吗?或者第一个选项是正确的?或者它真的没关系?

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}
javascript variables if-statement
5个回答
54
投票

截至ES2017规范(2017-07-08)正式发布,EcmaScript现在使用letconst关键字支持真正的块范围。


由于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

进一步阅读:JavaScript Scoping and Hoisting


2
投票

将var放在if语句中并不违反语言的“规则”,但这意味着,由于var提升,无论if语句的条件是否满足,都将定义var。


2
投票

请注意,ECMAscript 6确实使用'let'而不是'var'关键字来支持块级变量。虽然使用'var'声明的变量将被提升为函数范围,而不管它们在何处声明,但使用'let'定义的变量仅限于封闭块。


1
投票

因为JavaScript的变量具有函数级范围,所以您的第一个示例是有效地重新声明您的变量,这可以解释为什么它会被突出显示。

在旧版本的Firefox上,其严格的JavaScript模式用于警告此重新声明,但其中一位开发人员抱怨说它的风格很局促,因此关闭了警告。 (当前版本的Firefox支持块级变量声明语法。)


1
投票

请参阅four上的函数What is the scope of variables in JavaScript?

截至2012年,JavaScript中没有块级范围。所以你的第一个版本很好:变量是在if块之外的范围内定义的。

© www.soinside.com 2019 - 2024. All rights reserved.