在if语句中定义JavaScript变量

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

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

我知道上面的代码可以工作,但是WebMatrix突出显示了变量。

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

var b = '';
if(a==1){
    b = 1;
} else {
    b = 0;
}
lukeshek asked 2020-08-10T11:31:38Z
5个解决方案
57 votes

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


由于ECMAscript没有块作用域而是函数作用域,因此在函数上下文顶部声明任何变量是一个非常好的主意。

即使您可以在函数上下文中的任何时候进行变量和函数的声明,但如果您不完全了解其结果,它就会非常混乱并带来一些奇怪的麻烦。

头痛的例子:

var foo = 10;

function myfunc() {
    if (foo > 0) {
        var foo = 0;
        alert('foo was greater than 0');
    } else {
        alert('wut?');
    }
}

猜猜是什么,我们得到了“麻烦”? 在此处致电myfunc时发出警报。 那是因为ECMAscript解释器会自动将任何var语句和函数声明提升到上下文的顶部。 基本上,在第一个if statement之前,将foo初始化为undefined

进一步阅读:JavaScript范围和提升

jAndy answered 2020-08-10T11:32:06Z
2 votes

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

answered 2020-08-10T11:32:26Z
2 votes

请注意,ECMAscript 6确实使用'let'而不是'var'关键字支持块级变量。 尽管用'var'声明的变量无论声明在何处都被提升为函数作用域,但使用'let'定义的变量仅作用于封闭块。

farhadf answered 2020-08-10T11:32:46Z
1 votes

由于JavaScript的变量具有函数级范围,因此您的第一个示例有效地重新声明了变量,这可以解释为什么突出显示该变量。

在旧版本的Firefox上,曾经使用过严格的JavaScript模式来警告此重新声明,但是其中一位开发人员抱怨说,它限制了他的样式,因此该警告已关闭。 (当前版本的Firefox支持块级变量声明语法。)

Neil answered 2020-08-10T11:33:11Z
1 votes

有关JavaScript中变量的范围,请参见函数if

截至2012年,JavaScript中没有块级作用域。 因此,您的第一个版本很好:变量在if块之外的范围内定义。

hcarver answered 2020-08-10T11:33:35Z
translate from https://stackoverflow.com:/questions/11532072/defining-javascript-variables-inside-if-statements