为什么JSLint不允许“;var”;在for循环中

Why does not JSLint allow "var" in a for loop?

本文关键字:for 循环 var JSLint 不允许 为什么      更新时间:2023-09-26

我的代码或plovr有问题。我去JSLint寻求帮助。然而,JSLint似乎认为这是一个致命的错误,并拒绝检查更多的代码:

for (var i = 0; i < data.length; i += 4) {

为什么?我喜欢这种宣告"我"的方式。

如果您在Windows上,JSHint似乎不是一个替代方案。我现在正在试用在线林特。我有一种感觉,这个错误会有点难找到,所以我很高兴能得到关于好的代码检查器的建议。

我同意Niet the Dark Absol的观点,即该工具是基于意见的。反思它强加的所有规则,以及它们在你的特定项目中是否真的有意义。它也不是JavaScript的唯一"lint"工具。也许ESLint或其他类似的工具更适合您的需求。

但我也不同意他的观点:在函数开始时声明所有变量是不好的做法,尤其是在函数很长的情况下,因为这会使理解程序变得更加困难。IMHO,无论JavaScript的作用域如何工作,这一点都成立:这与程序语义无关,而是与代码可读性有关!

我认为,应该在尽可能接近第一次使用时声明变量(即,在您的情况下:在for循环中)。这确保了阅读你的代码的人(三个月后的同事或你自己)脑子里的信息也尽可能少。在开始时声明所有变量会迫使读者在整个函数中记住所有这些变量。像"这个变量的当前值是多少?"或"它的目的是什么?"这样的问题变得更难回答。

此外,您更倾向于将一个变量用于多个目的。这不仅令人困惑,而且很危险!值可能从第一次使用"泄漏"到第二次使用。这可能会导致微妙的、难以调试的问题。

我个人认为JSLint是个弱智。但在这个敏感话题上,意见可能会有所不同
—失调,45秒前

嘿,这其实是一个有效的观点。JSLint完全是基于的观点构建的,它不是上帝的话语。

然而,一般的好做法是在一个地方声明所有变量,在函数块的开头:

function doSomething() {
    var a, b, c, d;
    a = 1;
    c = 10;
    for( b = a; b < c; b++) {
        d = b*2 + a-c;
        alert(d);
    }
}

因为在for循环中创建一个bar会创建一个全局变量,这是JavaScript所做的事情之一,但大多数人都没有意识到。如果你不这样做,而你或其他人在该函数或全局范围内创建了相同的var,那么我的朋友将是著名的JavaScript步兵之一。