JSLint错误:将所有“ var”声明移至函数顶部


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

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

UPDATE 8/22/2011:找到了http://jshint.com,它看起来比http://jslint.com/更好


您能阐明您的问题吗?您实际上是在问两个问题吗?
James Wiseman

1
如果您取消勾选,它仍然会在第一个错误时停止Stop on first error吗?
大卫,

这个网站会做的更好的工作- > glat.info/jscheck
VSYNC

@Lee Kowalkowski-只需在此处复制代码并运行它即可。我在顶部声明变量,因此它将忽略它们。(例如Window,$等)
vsync

2
JSHint是一个不错的选择。
B罗伯斯特2012年

Answers:


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,因为它似乎专注于重要内容。


12
另外,请查看JSHint,它是部分为响应JSLint中的内容而创建的。看看这个讨论:stackoverflow.com/questions/6803305/...
乙Robster

1
感谢您指向 javascriptlint.com/online_lint.php。我一直在使用JSLint,但是很难遍历所有毫无意义的错误,这些错误甚至都不是JSLint上的错误。

14
我不同意您的意见,但必须指出javascript仅具有功能范围。它在for循环中没有块作用域。因此,即使ifor(var i=0; i<10; i+=1)其中定义了变量,整个函数也可以使用它,并且在初始化时将其提升到顶部。JSLint在语法上是正确的,但是在这种情况下,按照惯例,没有人以这种方式进行编码。
mastaBlasta

2
NVM你是完全正确的。我正在测试,看看如果一个函数中有两个循环for(var i=0; i<5; i+=1),如果编译器会variable already defined发出警告,那会发生什么,但是没有!即使在严格模式下,重新声明变量也不会引发警告或错误。因此,是的,JSLint是错误的。
mastaBlasta

2
@Zon:或者i像其他理智的开发人员一样再次使用。无论您在哪里声明var i,都可以重复使用。
Lee Kowalkowski

7

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


真的吗?!遗憾,但分享+1确实有用。
Lee Kowalkowski

@jjrv您是否有一个与闭包编译器不兼容的代码示例?我正在使用它,还没有看到任何问题。
JavaKungFu

@JavaKungFu的症状是,如果在CompilerOptions.java中设置reportUnknownTypes = CheckLevel.WARNING,则编译器报告的键入代码少于100%,并显示警告。
jjrv

哦,好的,我误解了您的答案,我认为它实际上在编译后的代码中造成了问题。谢谢。
JavaKungFu 2013年

5

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

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



3

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


1

即使新的beta JSLint并未说明var函数中具有多个容忍度的注释指令,但它似乎确实支持原始版本中的指令。

原始的JSLint允许您执行以下操作:

/*jslint vars: true */

以我的经验,这仍然有效—我认为是向后兼容。撰写本文的时间是2015年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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.