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 = 0
和i++
不会改善警告,JSLint 只是停止处理。
【问题讨论】:
没有理由在 for 循环的第一部分中使用i
,如果您在其他地方进行声明和初始化,则将该部分留空并保留分号-
直接在 Visual Studio 中删除导致警告并在 JSLint 中显示为 Unexpected 'for'.
和 Expected ';' and instead saw ')'.
。我很确定 for 需要所有三个组件才能正常工作。
Visual Studio 在我个人看来是一个糟糕的 IDE。 for(;i<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
语句。使用数组方法 比如forEach
。for
选项将抑制一些警告。这 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 菜单选项