见https://github.com/IgniteUI/ignite-ui/pull/243 :
2.9.2 的第一个构建通过,2.9.3 更新的连续构建失败,一行用 /*jshint -W100 */ 包裹
在更新博客中看不到任何相关内容,但处理方式是否发生了变化?
感谢您的报告! 这确实是一种倒退。
并不是说它对您有多大帮助,但看起来新版本出现了一个先前存在的错误——在减少您共享的输入的过程中,我在 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 一段时间,因为它适用于我们的文件,并将考虑将有问题的部分分解为我们将来可以管理的块:)
最有用的评论
感谢您的报告! 这确实是一种倒退。
并不是说它对您有多大帮助,但看起来新版本出现了一个先前存在的错误——在减少您共享的输入的过程中,我在 2.9.2 版本中也遇到了这个问题。
我需要离开一会儿,但我希望今晚(美国东部标准时间)准备好补丁。