【问题标题】: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://stackoverflow.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 说明中看到这一点。

标签: javascript jslint


【解决方案1】:

看起来 the follow-up problem 不是 [只是?] 由于 JSLint 处于测试阶段。 这是因为默认情况下 Crockford 不再允许 for 声明。 看来我需要为 read the new instructionssource 留出一个周末。奇怪的事情正在 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 的答案,他更好地解释了这个错误可能在幕后发生的情况。感谢您的帮助。
猜你喜欢
  • 2017-05-11
  • 2013-02-15
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多