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

IT技术 javascript jslint
2021-02-21 01:35:46

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/好多了

6个回答

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

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


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

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

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

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

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

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

@Zon:或者i像任何理智的开发人员一样再次使用无论您在哪里声明var i,都允许重用。
2021-04-21 01:35:46
感谢您指向 javascriptlint.com/online_lint.php我一直在使用 JSLint,但很难通过所有关于错误的毫无意义的胡说八道,这些错误甚至不是 JSLint 上的错误。
2021-04-24 01:35:46
另外,请查看 JSHint,它部分是为了响应 JSLint 中的类似内容而创建的。并查看此讨论:stackoverflow.com/questions/6803305/...
2021-05-03 01:35:46
我不同意你的观点,但重要的是要指出 javascript 只有函数作用域。它在 for 循环中没有块作用域。因此,即使变量ifor(var i=0; i<10; i+=1)其中定义,整个函数也可以使用,并在初始化时被提升到顶部。JSLint 在语法上是正确的,但在这种情况下,按照惯例,没有人以这种方式编码。
2021-05-03 01:35:46
NVM 你是完全正确的。我正在测试如果你在一个函数中有两个循环会发生什么for(var i=0; i<5; i+=1),如果编译器会抛出variable already defined警告,但它没有!即使在严格模式下,重新声明变量也不会引发警告或错误。那么是的,JSLint 是错误的。
2021-05-16 01:35:46

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

哦,好吧,我误解了你的答案,我认为它实际上在编译代码中造成了问题。谢谢。
2021-04-29 01:35:46
真的吗?!很遗憾,但分享真的很有用,+1。
2021-04-30 01:35:46
@jjrv 你有一个不适用于闭包编译器的代码示例吗?我正在使用它,没有看到任何问题。
2021-05-02 01:35:46
@JavaKungFu 的症状是编译器报告的类型代码少于 100%,如果在 CompilerOptions.java 中设置 reportUnknownTypes = CheckLevel.WARNING,则会显示警告。
2021-05-14 01:35:46

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

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

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

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