我在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);
答案 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警告的方式 关于在预期范围之外使用的变量。