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

时间:2011-01-10 11:45:47

标签: javascript jslint

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来测试代码,因为它会在此错误上停止扫描脚本。

我有很多代码,并且不希望将此警告威胁为严重错误。

更新2011年8月22日:找到http://jshint.com,它看起来比http://jslint.com/

好多了

7 个答案:

答案 0 :(得分:151)

2017年6月更新:受支持(例如,如果您未在Internet Explorer 10或更低版本中运行JavaScript),则应考虑使用let代替{{3 }}。

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


我无法将var i;放在我职能顶部的for(var i=0; ...; i++)。特别是当varfor部分(12.6)中将其作为可接受的语法时。此外,它是The JavaScript Specification在其示例中使用的语法。

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

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

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

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

目前,我正在使用Brendan Eich,因为它似乎专注于重要的事情。

答案 1 :(得分:7)

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

答案 2 :(得分:5)

您可以随时下载legacy versions,也可以修改latest version。这并不难,真的(搜索move_var)。然后在本地运行jslint,使用节点,或使用带有简单HTML表单的浏览器 - 您可能想要复制Crockford的原始文件。

请注意,警告是作为major rewrite的一部分引入的,并且仅在for(之后发生,因此该消息有点误导。

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

即使 new beta JSLint没有在函数中记录多个var容差的注释指令, 似乎支持原始版本的指令。

原始JSLint允许您这样做:

/*jslint vars: true */

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

答案 6 :(得分: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
}