Jshint: 禁用 W100 的警告在 2.9.3 中不起作用

创建于 2016-08-19  ·  4评论  ·  资料来源: jshint/jshint

https://github.com/IgniteUI/ignite-ui/pull/243

2.9.2 的第一个构建通过,2.9.3 更新的连续构建失败,一行用 /*jshint -W100 */ 包裹

更新博客中看不到任何相关内容,但处理方式是否发生了变化?

Regression

最有用的评论

感谢您的报告! 这确实是一种倒退。

并不是说它对您有多大帮助,但看起来新版本出现了一个先前存在的错误——在减少您共享的输入的过程中,我在 2.9.2 版本中也遇到了这个问题。

我需要离开一会儿,但我希望今晚(美国东部标准时间)准备好补丁。

所有4条评论

感谢您的报告! 这确实是一种倒退。

并不是说它对您有多大帮助,但看起来新版本出现了一个先前存在的错误——在减少您共享的输入的过程中,我在 2.9.2 版本中也遇到了这个问题。

我需要离开一会儿,但我希望今晚(美国东部标准时间)准备好补丁。

这是故事:

在表达式中遇到左括号字符 ( ( )
位置,像 JSHint 这样的 ES2015 感知 JavaScript 解析器必须确定
它是否标志着分组运算符或箭头函数的开始。

JSHint 通过标记所有随后的输入来做到这一点,直到它找到一个
“匹配”右括号字符( ) )。 到时候可以做一个
确定相关产品的性质——如果遵循
通过=>标记,它是一个箭头函数; 否则,它是一个分组运算符。

当它向前看时,它不会应用它遇到的内联指令
比如-W100 。 但是,词法分析器负责发出某些 linting
错误_包括_ W100 。 所以只要 JSHint 开始“向前看”,它的
对这些潜在危险字符的响应行为被“锁定”。
(这表明任何遭受这种回归的人的短期修复:禁用
W100在 IIFE 之前。 不理想,我知道,但请注意警告是有争议的。)

这种回归是因为一个看似无关的补丁:gh-3003。
以前,如果分号标记被取消,则前瞻将被取消
遇到,如:

(function() {
;//<-- lookahead ends at this semicolon token
}());

...然而,这被发现是一个无效的启发式,因为箭头函数
参数本身可能包含该标记:

(x = function() {
;//<-- lookahead should *not* end at this semicolon token
}) => x;

所以我们删除了它,以便在这些情况下正确识别箭头功能。

考虑到这一点,完全简化的测试用例可能会更清晰一些(即
是字符串文字中不可打印的\u200f字符):

(function() {
    ;

    /*jshint -W100 */
    "‏";
})();

在 gh-3003 之前(例如 2.9.2 版的 JSHint),分号将停止
向前看,并且在_之后_之前不会对不可打印的字符进行词法分析
应用了 JSHint 指令。 应用修复后,JSHint 对字符进行词法分析
_before_ 应用指令并继续发出警告。

这也说明了即使在 JSHint 2.9.2 中也存在根本问题。
即使在该版本中,以下输入也会错误地触发警告
JSHint:

(function() {
    /*jshint -W100 */
    "‏";
})();

因为在这里,括号触发的前瞻在任何一个中都不会被打断
版本。

理想的解决方法是在前瞻期间应用指令。 不幸的是,由于
由于 JSHint 内联指令的高度灵活特性,这不是
可能的。 用户期望指令具有“功能范围”,即词法分析器
需要了解它产生的标记的周围语义。

我在这里提交了一个修复:gh-3016。 从长远来看,我认为我们应该考虑
对前瞻启发式的其他改进——没有(无效的)分号
检查,将整个程序包装在 IIFE 中的常见做法会导致
JSHint 最初对所有输入进行 lex。

感谢您的详细解释!
我知道如果不为示波器添加大量额外工作,这会是多么棘手。
我们将坚持使用 2.9.2 一段时间,因为它适用于我们的文件,并将考虑将有问题的部分分解为我们将来可以管理的块:)

新发布的 JSHint 版本 2.9.4 现在可以修复此错误:

http://jshint.com/blog/2016-10-20/release-2-9-4/

如果您对该版本仍有问题,请告诉我们!

此页面是否有帮助?
0 / 5 - 0 等级