在if语句中定义JavaScript变量

Defining JavaScript variables inside if-statements

本文关键字:JavaScript 变量 定义 if 语句      更新时间:2023-11-23

if语句内部定义JavaScript变量是否正确?

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

我知道上面的代码会起作用,但是WebMatrix突出显示了变量。

我应该在if语句之外定义变量吗?或者第一个选项是正确的?或者这其实并不重要?

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

截至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在第一个if statement之前被初始化为undefined

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

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

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

因为JavaScript的变量具有函数级作用域,所以第一个例子是有效地重新定义变量,这可以解释为什么它会被突出显示。

在旧版本的Firefox上,其严格的JavaScript模式用于警告这种重新声明,但其一名开发人员抱怨这限制了他的风格,因此关闭了警告。(当前版本的Firefox支持块级变量声明语法。)

请参阅函数four关于JavaScript中变量的作用域是什么?

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