JSLint错误:将所有'var'声明移到函数的顶部
JSLint网站更新,我不能再检查JS脚本。 对我来说,这个警告并不重要,我不想通过数千行来解决这个问题,我想find更多的关键问题。
有谁知道如何closures这个错误,或使用传统的JSLint?
UPDATE
例:
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).
问题:
在function之上有variables是新的要求。 我无法使用JSLINT来testing代码,因为它会停止对此错误进行脚本扫描。
我有很多的代码,不想威胁这个警告作为关键的错误。
UPDATE 8/22/2011:发现http://jshint.com ,它看起来比http://jslint.com/好多了
2017年6月更新:受支持(例如,如果您不在Internet Explorer 10或更低版本中运行JavaScript),您应该考虑使用let而不是var 。
例如: for(let i=0; ...; i++)
我不可能把var i;
放进去 从我的函数顶部的一个for(var i=0; ...; i++)
。 特别是当JavaScript规范将它作为for
部分(12.6)中的可接受语法时。 另外,这是Brendan Eich在他的例子中使用的语法。
把声明移到最前面的想法是,它应该更准确地反映出发生了什么,但是这样做只会反映,而不会影响。
对我来说,这是for
迭代的一个荒谬的期望。 更多的是因为JSLint检测到它时停止处理。
是否有variables声明在一个函数的顶部更易读是有争议的。 我个人更喜欢使用迭代器variables来声明它们。 我不在乎variables是否已经在内部创build,我在这里初始化,所以我很安全。
我会争辩说,在使用它们的地方声明一个迭代器variables可以确保它们不会意外地成为全局variables(如果将循环移出到另一个函数中,则迭代器variables将随之移动)。 这比维护函数顶部的variables声明更可维护。
现在,我使用http://www.javascriptlint.com/online_lint.php,因为它似乎专注于重要的东西。;
Google Closure编译器实际上无法正确地检测for … in循环的循环variables的types,除非它被声明为(var i in …),并且没有注解似乎解决了这个问题,所以声明不能被移动到顶部。
您可以随时下载旧版本 ,或修改最新版本 。 这并不难,真的(searchmove_var
)。 然后在本地运行jslint,使用节点或使用带有简单HTML表单的浏览器 – 您可能需要复制Crockford的原始版本。
请注意,该警告是作为重大改写的一部分而引入的,并且仅在for(
后发生,因此该消息有点误导。
请注意,将所有variables移动到顶部与“允许每个函数使用一个var语句”不同。 将所有variables移到顶端的要求是新的,似乎没有开关。 更多http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e
当我们想切换到最新版本的JSLINT时,我在代码库上遇到了这个问题。 我们有很多这样的人,移动声明的人不满意。 实际上,我们发现最优雅的解决scheme是使用underscore.js,而不是使用完整的详细循环来使用_.each()函数,该函数删除了JSLint错误,使我们的代码更实用,更清洁,更紧密,更容易读。
即使新的testing版JSLint没有在一个函数中logging多个var
容差的注释指令,它似乎也支持来自原始版本的指令。
原来的JSLint允许你这样做:
/*jslint vars: true */
根据我的经验,这仍然有效 – 我认为是向后兼容的。 写这篇文章的时间是2015年6月。
我发现以下语法将删除错误:
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 }