【发布时间】: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