在Javascript中的if语句中声明变量是错误的吗?

时间:2012-06-05 23:34:38

标签: javascript

我在Sublime Text 2中安装了Sublimelinter,它很棒。但是它不喜欢以下代码:

if(condition){
    var result = 1;
}else{
    var result = 2;
}
process(result);

它表示var result = 2;已经定义了结果,process(result);表示它已经超出了范围。它只是将if语句的{}误认为是一个更封闭的范围,还是我真的应该这样做:

var result;
if(condition){
    result = 1;
}else{
    result = 2;
}
process(result);

7 个答案:

答案 0 :(得分:5)

不,这不是“错误的”;根据ECMAScript规范,它将被提升到最近的函数定义的顶部。

是的,您的程序“Sublimelinter”声称变量超出范围是不正确的。

答案 1 :(得分:2)

没错。如果您收到该错误,则先在代码中定义result

您还可以简化您的条件,这样您就不必使用结果:

process( condition ? 1 : 2 );

答案 2 :(得分:1)

Javascript没有像许多其他语言一样的“块范围”。如果是,则在您尝试调用result时,变量process(result)将不存在,因为无法在定义它的{}块之外引用它。

但是,javascript只有函数作用域,其中一个函数中的变量不能被另一个函数访问。在函数中声明变量的地方没有任何意义,因为它仍然可以从该函数内的任何地方访问(没有块作用域)。因此,您发布的两个代码片段都与运行代码的解释器等效。

第二个是优选的,因为它更清楚,因为它显示了变量的使用位置(整个函数)。它还可以防止变量在函数范围内被声明两次,这可能不一定会导致任何不好的事情发生,但它绝对不会导致任何有益的事情。您应该几乎总是在较高级别声明一次变量,而不是在不同的较低级别声明两次,即使它并不重要,因为变量的范围将是整个函数,无论它在何处被声明。

答案 3 :(得分:0)

JavaScript没有块范围。变量的作用域是它们定义的函数,这意味着当你在if块中声明一个变量时,它会被“提升”到函数的顶部。

由于变量在技术上最终定义在函数顶部,因此将变量声明移动到函数顶部被认为是最佳实践,以便代码的意图清晰。

我说你的代码并没有“错误”,但是对于那些不熟悉范围如何在JavaScript中运行的代码的人来说,这是误导性的。我肯定会选择第二个版本,因为它实际上反映了代码的执行方式。

Here's a good article解释变量吊装。

答案 4 :(得分:0)

在你的if语句所在的函数中声明你的var指针一次。就像ninjagecko提到的那样,所有变量都被发送到它们包含函数的顶部。

然而;要小心,因为如果你像它一样声明两次相同的var,它将重置var。

答案 5 :(得分:0)

我建议这样做:

var result = MORE_LIKELY_OUTCOME;

if (LESS_LIKELY_CONDITION) {
    result = LESS_LIKELY_OUTCOME;
}

process(result);

这样,您最初将结果设置为您大多数时间所期望的结果。 然后,if语句将在条件发生时更改结果。

答案 6 :(得分:0)

事实证明,SublimeLinter正在使用JSHint,它可以选择压制此警告并解释它存在的原因。


  

funcscope 此选项禁止声明有关声明变量的警告   在控制结构内部,同时从中访问它们   外。尽管JavaScript只有两个真实的范围 - 全局和   功能 - 这种做法导致新人之间的混淆   语言和难以调试的错误。这是默认情况下JSHint警告的方式   关于在预期范围之外使用的变量。