59

我有这个代码:

 if ( something is true ) {
        var someVar = true;
    } else {
       var someVar = false;
    }

JsHint 在 else 语句部分说“someVar 已被定义”。为什么会这样,我该如何解决?

谢谢

4

3 回答 3

80

JS 变量没有块作用域,它们具有“函数”作用域(有时是全局的)。

声明(但不是赋值)被“提升”到函数的顶部。

jshint 警告您有两个这样的声明 - 您的代码相当于:

var someVar;
var someVar;  // warning!
if (something) {
     someVar = true;
} else {
     someVar = false;
}
于 2013-10-16T20:06:47.570 回答
21

这是由于吊装。

在 javascript 中,无论您在何处使用 定义新变量var,它都会将其移动到您所在函数的顶部。您的代码在函数顶部的 if 块上方生成以下内容:

var someVar;
var someVar;

这是一个解释提升的教程:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

于 2013-10-16T20:05:56.917 回答
12

你不应该把var声明放在这样的地方。将var声明放在 之前if,然后将“someVar”设置为一个值。

确实,在这里您根本不需要if声明:

var someVar = !!(something);

会做同样的事情。(基于 的“真实性”,双重应用!确保“someVar”设置为true或。)falsesomething

于 2013-10-16T20:05:53.113 回答