我的问题类似于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循环,用它更新了示例代码。
答案 0 :(得分:2)
不要忽略该警告,实际上没有必要为每次循环运行创建一个新函数。
这种方法更好,只要你使用定义保持在odd()函数内,它就没有任何副作用,它会看到与传递给forEach的匿名函数相同的变量状态
编辑:即使您决定忽略该警告,也要一致地执行 - 使用不认为这是错误的jshint配置,或添加jshint注释以在代码中临时禁用此警告类型(使用jshint --verbose获取选择性切换的警告代码),不要让任何显示的jshint警告在没有通知的情况下发生,这样就无法首先进行代码分析。