Jshint:循环中的匿名函数(问题)

Jshint: Anonmyous function within a loop (Issue)

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

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

Don't make functions within a loop.

示例代码:

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

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

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

不要忽略那个警告,真的没有必要为每个 运行 循环创建一个新函数。

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

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