【问题标题】:Jshint: Anonmyous function within a loop (Issue)Jshint:循环中的匿名函数(问题)
【发布时间】:2015-01-27 08:36:34
【问题描述】:

我的问题类似于JSHint won't let me use 'forEach' in a 'for' loop

我们目前项目中有大约 2k JS 行,最近包括jshint 检查,一个常见的问题是下面的示例代码会抛出

不要在循环中创建函数。

示例代码:

var s1 = '12345'.split('');
var oo = { a: s1, b: s1, c: s1};

function odd(obj){
    var tmp = [];
    for (var key in obj){
        obj[key].forEach( function(val){
            if(val%2>0) tmp.push(val);
        });
    }
    return tmp;
}


odd(oo);

我的解决方法是:

function odd(obj){
    var tmp = [], tmpFn;
    tmpFn = function(val){
        if(val%2>0) tmp.push(val);
    };
    for (var key in obj){
        obj[key].forEach(tmpFn);
    }
    return tmp;
}

我已经检查过,这可行,但我不确定这是否是修复旧代码的正确方法,此修复是否会产生任何不需要的副作用?还是我应该忽略警告,因为旧代码看起来更干净?

编辑:我错过了一个 for 循环,用它更新了示例代码。

【问题讨论】:

  • 复制/粘贴代码时没有看到此错误。您能否展示一个更完整的代码示例来显示该问题?
  • 该代码不是在循环中创建函数,除非您在循环中有function odd() { ... },这是一个更严重的语法错误:Function 声明不允许在控制结构内部,它们必须在执行上下文的顶层(例如,在函数或全局上下文中的所有控制结构之外)。
  • 旁注:我会使用filter
  • 最后:函数声明后不需要;; 用于终止语句(块语句除外);声明不是陈述。
  • 您应该避免在循环中创建不必要的变量和函数,因为它们会消耗大量资源并因此被标记为不好的做法。在您的代码中,您要过滤符合条件的记录列表......您应该首先准备谓词函数,然后将其传递给循环。

标签: javascript jshint


【解决方案1】:

不要忽略该警告,实际上没有必要为每次循环运行创建一个新函数。

这种方法更好,只要你留在odd()函数的定义中,它不会有任何副作用,它会看到与传递给forEach的匿名函数相同的变量状态.

编辑:即使您决定忽略该警告,也要始终如一地执行 - 要么使用不认为这是错误的 jshint 配置,要么添加 jshint 注释以在代码中临时禁用此警告类型(使用 jshint --verbose 获取选择性切换的警告代码),不要让任何显示的 jshint 警告在没有通知的情况下消失,这违背了首先进行代码分析的目的。

【讨论】:

  • 我认为这个警告不能避免......直到你创建动态模板,在运行时作为匿名函数传递......你应该避免这样的代码。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多