jslint警告“不要在循环中创建函数”仅用于引用外部变量的函数?

时间:2016-10-24 17:22:34

标签: javascript jshint

我在循环中创建了两个匿名函数,但jshint仅在anon函数引用未传递给它的变量时发出警告。

为什么会这样?

(function(){
  for(var i=0; i<5; ++i){
    var age = 9001;
    //This has a jshint warning, as it uses age
    var cutoffs = [1800,12000].map(function(cutoff){
      return cutoff < age;
    });
    //but this doesn't cause a warning, despite creating a function inside a loop
    var cutoffs2 = [1800,12000].map(function(cutoff){
      return cutoff < 42;
    });
  }
})();

2 个答案:

答案 0 :(得分:3)

这只是一个应该改变的坏警告。

从我开的jshint issue

  

最初报告了所有功能的警告   在一个循环中。直到gh-1887(在2.5.7版本中发布)才开始   警告仅限于具体案件,根据其所涉及的约束   关闭。该文本可能当时也应该更新。

只要处理完毕,它将由jshint pull request 3058修复。

答案 1 :(得分:0)

只要函数在循环内(在下一次刺激之前)同步执行或不引用计数器(i),就不会有任何意外结果。

有关问题的完整说明和解决方法,请参见http://linterrors.com/js/dont-make-functions-within-a-loop

https://github.com/jshint/jshint/pull/1887#issuecomment-57963322

只是转瞬即逝...为什么在这里停下来?实际上,唯一危险的循环函数是在函数内部使用循环变量而不关闭它的函数。

我知道这是朝着正确方向迈出的一步,但是在这里使用外部作用域变量并不是危险的,它本身就是循环变量。我们应该对此检查进行更宽大的处理。