77

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://jslint.com,它看起来比http://jslint.com/好多了

4

7 回答 7

151

2017 年 6 月更新:受支持(例如,如果您没有在 Internet Explorer 10 或更低版本中运行 JavaScript),您应该考虑使用let而不是var

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


我不可能把var i;afor(var i=0; ...; i++)放在我的函数的顶部。尤其是当JavaScript 规范将其作为for第 (12.6) 节中可接受的语法时。此外,这是Brendan Eich在他的示例中使用的语法。

将声明移到顶部的想法是,它应该更准确地反映幕后发生的事情,但是,这样做只会反映,不会影响。

对我来说,这是对for迭代的荒谬期望。更是如此,因为 JSLint 在检测到它时会停止处理。

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

我会争辩说,在使用它们的地方声明一个迭代器变量可以确保它们不会被意外地设为全局(如果你将循环移到另一个函数中,迭代器变量也会随之移动)。这比必须在函数顶部维护变量声明更易于维护。

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

于 2011-06-20T13:12:31.843 回答
7

Google Closure 编译器实际上将无法正确检测 for...in 循环的循环变量的类型,除非它被声明为 for (var i in ...) 并且似乎没有注释可以解决此问题,因此无法移动声明到顶部。

于 2012-06-30T15:18:49.047 回答
5

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

请注意,警告是作为主要重写的一部分引入的,并且仅在 之后出现for(,因此该消息有点误导。

于 2011-02-01T23:11:30.113 回答
4

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

于 2011-02-01T21:46:11.483 回答
3

当我们想切换到最新版本的 JSLINT 时,我的代码库出现了这个问题。我们有很多这样的人,人们对移动宣言不满意。我们实际上发现最优雅的解决方案是使用 underscore.js,而不是使用完整的冗长循环,而是使用 _.each() 函数,它消除了 JSLint 错误并使我们的代码更实用、更简洁、更紧凑、更容易读。

于 2011-08-29T10:22:54.790 回答
1

尽管的beta JSLint没有记录var一个函数内的多重容差的注释指令,但似乎支持原始版本的指令。

原来的JSLint允许你这样做:

/*jslint vars: true */

以我的经验,这仍然有效——我想是为了向后兼容。撰写本文的时间是 2015 年 6 月。

于 2015-06-09T23:02:29.123 回答
0

我发现以下语法将删除错误:

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
}
于 2016-04-29T03:15:03.440 回答