JSLint 的“语句位置出现意外的表达式‘i’”是啥意思?

Posted

技术标签:

【中文标题】JSLint 的“语句位置出现意外的表达式‘i’”是啥意思?【英文标题】:What does JSLint mean by 'Unexpected expression 'i' in statement position.'?JSLint 的“语句位置出现意外的表达式‘i’”是什么意思? 【发布时间】:2015-07-27 16:51:53 【问题描述】:

我在 javascript 中有一个 for 循环,我已经通过 JSLint 运行了几次。过去我收到the unexpected++ error,我决定重构以使我的代码更具可读性。大约一个月后,JSLint 发布了更新,现在显示警告...

语句位置出现意外的表达式“i”。 for (i; i

//See JSLint.com for why I pulled out i initialization and i = i+1 instead of i++
//and http://***.com/questions/3000276/the-unexpected-error-in-jslint
var i = 0;
for (i; i < scope.formData.tabs.length; i += 1) 
    scope.formData.tabs[i].show = false; // hide all the other tabs 

    if (scope.formData.tabs[i].title === title) 
        scope.formData.tabs[i].show = true; // show the new tab 
    

恢复到var i = 0i++ 不会改善警告,JSLint 只是停止处理。

【问题讨论】:

没有理由在 for 循环的第一部分中使用 i,如果您在其他地方进行声明和初始化,则将该部分留空并保留分号- 直接在 Visual Studio 中删除导致警告并在 JSLint 中显示为 Unexpected 'for'.Expected ';' and instead saw ')'.。我很确定 for 需要所有三个组件才能正常工作。 Visual Studio 在我个人看来是一个糟糕的 IDE。 for(;i&lt;x;i++) statement; 是一个完全有效的 for 循环,不管它告诉你什么。 如果你还是不信,看MDN docs for the for loop 您在哪里看到 var i=0; for (i; ... 在 JSLint 中优于 var i; for (i=0; ...?我不一定在 linked question 和 JSLint 说明中看到这一点。 【参考方案1】:

看起来 the follow-up problem 不是 [只是?] 由于 JSLint 处于测试阶段。 这是因为默认情况下 Crockford 不再允许 for 声明。 看来我需要为 read the new instructions 和 source 留出一个周末。奇怪的事情正在 K 圈发生,伙计。

ES6 最重要的新特性是正确的尾调用。这有 没有新的语法,所以 JSLint 看不到它。但它使递归更多 有吸引力,这使得循环,尤其是 for 循环,少得多 吸引人的。

然后在/*jslint */ 指令部分的主表中:

描述:容忍for声明 选项:for 含义:true 如果应该允许 for 语句。

表格下方还有一点解释:

JSLint 不推荐使用for 语句。使用数组方法 比如forEachfor 选项将抑制一些警告。这 JSLint 接受的 for 形式受到限制,不包括新的 ES6 形式。

所以要在新的 JSLint 中创建这个 lint,您至少需要 这段代码(使用 for 指令集):

/*jslint white:true, for:true */
/*global scope, title */

function test()

    "use strict";
    var i;

    for (i=0; i < scope.formData.tabs.length; i = i + 1) 
        scope.formData.tabs[i].show = false; // hide all the other tabs 

        if (scope.formData.tabs[i].title === title) 
            scope.formData.tabs[i].show = true; // show the new tab 
        
    

请注意,我确实仍然需要移动 i 的初始化,因此您可能仍然遇到值得 reporting 的问题。我也会承认I'm with Stephen at the question you link;我不确定为什么i+= 1 更好。但现在它看起来像是一个硬性要求。没有plusplus 选项。

另请注意,如果代码未包装在函数中(我在上面的 test 中包装),您将收到 Unexpected 'for' at top level.,这是一个新错误。

【讨论】:

这些问题可能更适合 jslint 论坛或阅读文档,但我想我会检查一下你是否碰巧知道。我检查了 Assume ES6、Tolerate 'for statement' 和 'messy white space'。我是否应该使用与“意外表达式”消息更好地交互的界面进行另一项检查,或者您是否使用自定义 /*jslint ignore*/ 标签? 刚刚使用了上面的代码。我确实尝试将es6:true 添加到jslint 指令评论中,效果也很好。【参考方案2】:

编辑: 好像我弄错了。有关更详细的解释,请参阅 ruffin 的答案。

似乎问题出在 jslint.com 上。请记住,它仍处于测试阶段。如果您使用旧版本 (old.jslint.com),问题似乎就消失了。

这是 old.jslint.com 的输出: 这主要是关于未定义范围......等等。

这是来自 jslint.com 的输出: 这是关于未定义范围......等等和

意外的“为”。

随着

语句位置出现意外的表达式“i”。

现在,我想你应该只使用旧版本的 jslint.com。

【讨论】:

我错过了标题旁边的 beta 文本。在我看到它消失之前,我会推迟做任何事情。旧的 jslint 网站给了我预期的结果。 @JabberwockyDecompiler 好。很高兴我能帮上忙! 我正在将接受的答案更改为 ruffin 的答案,他更好地解释了这个错误可能在幕后发生的情况。感谢您的帮助。

以上是关于JSLint 的“语句位置出现意外的表达式‘i’”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2013 - Web 项目上的 JSLint.NET 安装不显示预期的 Jslint 菜单选项

jslint-vim 配置

无法调用 JSLint! jslint.vim 无法在 Windows 7 (x64) 中工作

JsLint 的安装和使用

JSLint notepad++使用

JsLint'超出范围'错误