【问题标题】:jslint warning "Don't make functions within a loop" only for functions referencing outside variables?jslint警告“不要在循环中创建函数”仅适用于引用外部变量的函数?
【发布时间】:2016-10-24 17:22:34
【问题描述】:

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

这是为什么?

(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;
    });
  }
})();

【问题讨论】:

  • 忽略这一点,linting 很糟糕,并认为您在循环中声明了一个函数。
  • @Eric 但是我在循环内声明了一个函数,我只是好奇为什么它没有对循环内声明的两个函数发出警告。
  • 我想知道是不是因为reduce函数没有引用闭包中的任何东西——所以它可以通过运行时优化吗?没有任何依据,但这是两者之间的区别之一。
  • 我认为这可能是一个是多行而另一个不是的事实。 linter 将单行函数视为内联函数,而多行函数似乎是完整的函数调用。
  • @DougMoscrop 似乎就是这样。 jshint 仅在引用外部变量时发出警告。

标签: javascript jshint


【解决方案1】:

这只是一个应该更改的错误警告。

来自我打开的jshint issue

此警告最初是针对所有功能报告的 在一个循环内。直到 gh-1887(在 2.5.7 版本中发布) 根据它所围绕的绑定,警告仅限于特定情况 关闭。那时文本可能也应该更新了。

只要得到处理,jshint pull request 3058 就会修复它。

【讨论】:

    【解决方案2】:

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

    请参阅 http://linterrors.com/js/dont-make-functions-within-a-loop 以获取对该问题的完整说明和解决方法

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

    只是一个转瞬即逝的想法……为什么要停在这里?事实上,唯一危险的循环函数是在函数内部使用循环变量本身而不关闭它。

    我知道这是朝着正确方向迈出的一步,但是在这里使用外部范围变量并不是危险的,而是循环变量本身。我们应该让这个检查更加宽松。

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 2013-03-17
      • 2011-10-15
      • 2014-08-17
      • 2011-10-29
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多