JSLint 错误: 将所有‘ var’声明移到函数的顶部

JSLint 站点更新了,我不能再检查 JS 脚本了。对我来说,这个警告并不重要,我不想通过数千行代码来解决这个问题,我想找到更多重要的问题。

有人知道如何关闭此错误或使用遗留的 JSLint 吗?

更新

例如:

function doSomethingWithNodes(nodes){
this.doSomething();


for (var i = 0; i < nodes.length; ++i){
this.doSomethingElse(nodes[i]);
}


doSomething(); // want to find this problem
}

Jslint.com 输出:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.


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


Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

问题:

在函数之上添加变量是新的要求。我不能使用 JSLINT 来测试代码,因为它会停止扫描这个错误的脚本。

我有很多代码,我不想把这个警告作为关键错误来威胁。

更新8/22/2011: 发现 http://jshint.com,它看起来比 http://jslint.com/好多了

33128 次浏览

请注意,将所有 var 移到顶部与“允许每个函数使用一个 var 语句”不同。将所有变量移动到顶部的要求是新的,似乎没有开关。http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e台更多

您可以随时下载 传统版本,或修改 最新版本。这并不难,真的(搜索 move_var)。然后在本地运行 jslint,可以使用 node,也可以使用带有简单 HTML 表单的浏览器——您可能想要复制 Crocford 的原始版本。

注意,该警告是作为 重大改写的一部分引入的,并且只发生在 for(之后,因此该消息有点误导。

更新于2017年6月: 根据支持情况(例如,如果你没有在 Internet Explorer 10或以下运行 JavaScript) ,你应该考虑使用 而不是 Var

例如: for(let i=0; ...; i++)


我不可能把 for(var i=0; ...; i++)中的 var i;放在函数的顶部。特别是当 JavaScript 规范将其作为 for部分(12.6)中可接受的语法时。同时,这也是 Brendan Eich在他的例子中使用的语法。

将声明移到顶部的想法是,它应该更准确地反映在引擎盖下发生的事情,然而,这样做只会反映,而不是影响。

对我来说,这是对 for迭代的一个荒谬的期望。更重要的原因是 JSLint 在检测到它时停止了处理。

在函数的顶部声明变量是否更具可读性值得商榷。我个人更喜欢在使用迭代器变量时声明它们。我不在乎变量是否已经在内部创建,我在这里初始化它,所以我是安全的。

我认为在使用迭代器变量的地方声明一个迭代器变量可以确保它们不会意外地变成全局变量(如果您将循环移动到另一个函数中,迭代器变量将随之移动)。这比在函数顶部维护变量声明要容易得多。

现在,我使用 http://www.javascriptlint.com/online_lint.php,因为它似乎专注于重要的东西。

当我们想要切换到 JSLINT 的最新版本时,我的代码库出现了这个问题。我们有很多这样的宣言,人们不喜欢移动的宣言。实际上,我们发现最优雅的解决方案是使用 underscore.js,而不是使用完整的详细循环,而是使用 _。Each ()函数,它消除了 JSLint 错误,使我们的代码更加实用、清晰、紧凑和易于阅读。

Google Closure 编译器实际上无法正确检测 for... in 循环中循环变量的类型,除非它像 for (var i in...)那样声明,而且似乎没有注释可以解决这个问题,所以声明不能移到顶部。

尽管 新的 beta JSLint没有在一个函数中记录多个 var公差的注释指令,但是 是的似乎支持原始版本的指令。

最初的 JSLint允许你这样做:

/*jslint vars: true */

根据我的经验,这种方法仍然有效ーー我认为这是为了向后兼容性。

我发现下面的语法可以消除这个错误:

function doSomethingWithNodes(nodes) {
this.doSomething();
var i; // HERE is where you move the 'var' to the top of the function
for (i = 0; i < nodes.length; ++i) {
this.doSomethingElse(nodes[i]);
}


doSomething(); // want to find this problem
}