一些问题(#1301 和 #2225,也许其他)表明这已经解决,但 2.9.4 仍然警告循环中的函数如下:
const a = [], b = [];
for (let i in b) a.push(() => i);
for (let i of b) a.push(() => i);
for (let i = 0; i < 10; i++) a.push(() => i);
let i = 0;
while (i++ < 10) a.push(() => i);
感谢报告! 尽管对您提到的问题发表了评论,但我
找不到在哪里此行为已轻松过一个正确的JSHint版本。
另外:您分享的最后一个例子是一个特例,不应该
允许:
let i = 0;
while (i++ < 10) a.push(() => i);
i
绑定恰好是词法范围的事实实际上并不是
防止错误loopfunc
最初实施是为了避免。
此类代码的作者和读者可能希望每个函数都有一个
专用的i
绑定,但实际上,它们都共享相同的绑定。 如果有人
能够帮助解决此错误,请不要忘记说明
案件。
另外:您分享的最后一个例子是一个特殊情况,不应该被允许:
你完全正确...我真傻...^__^
关于真正的问题,我们对实现这一点有任何期望吗?
我们目前没有任何期望。 你愿意帮忙吗?
只是对遇到此问题的任何人说:此问题仍然存在于 jshint 2.9.5 中。
它产生的错误代码是 W083。
@overlookmotel - 五年多来一直遇到同样的问题。
我的建议是将/*jshint loopfunc: true */
放在 .js 文件的顶部,或者将"loopfunc" : true,
到.jshintrc
设置中。 它并没有真正解决这个问题,但如果它在 5 年多之后仍未得到解决,那么这不是可以或将很快解决的问题。
我将使用@stevenventimiglia的方法,用内联配置包装我的“违规”函数,在我知道我的代码引用合理的地方打开和关闭 loopfunc lenience。
也就是说,我想我会提供一个进一步的例子来强调这条规则的一些差距:
function foo(myLoopArr)
{
/* globals Promise: false */
for(let val in myLoopArr)
{
const myPromArr = [];
myPromArr.push(function() {
return new Promise();
});
}
}
上面的函数没有任何用处。 但是,重要的是,循环中的任何值都没有引用循环外的任何变量。 然而 jshint 抛出警告:
myPromArr.push(function() {
^ Functions declared within loops referencing an outer scoped variable may lead to confusing semantics.
只是想通过指出这个警告可能会在词汇上合理的情况下引起火灾。
@andrew-st-angelo-77media 很好地报道了这一点。 我只是得到完全相同的错误,即使我的函数没有引用任何外部作用域变量。 我希望这会得到照顾。
最有用的评论
我将使用@stevenventimiglia的方法,用内联配置包装我的“违规”函数,在我知道我的代码引用合理的地方打开和关闭 loopfunc lenience。
也就是说,我想我会提供一个进一步的例子来强调这条规则的一些差距:
上面的函数没有任何用处。 但是,重要的是,循环中的任何值都没有引用循环外的任何变量。 然而 jshint 抛出警告:
只是想通过指出这个警告可能会在词汇上合理的情况下引起火灾。