对于在循环中声明的复杂函数,我可以看到为什么我不想这样做,但为什么它会被认为是错误的javascript?
我们可以将该函数命名并将其置于循环之外,但是为简单(无异步)的事物扰乱了流程。
例如,下面是一个循环中的简单内联函数声明(JSHINT / LINT抱怨,为什么这被认为是不行?
for (var i = 0, len=arr.length; i < len; ++i) {
dosomething(arr[i], function(returnvalue) {
console.log(returnvalue);
});
};
答案 0 :(得分:3)
在每次迭代中创建一个函数都是无用的。
大多数情况下,在客户端JavaScript中,性能并不重要,并且没有问题,但最好采取并保持良好的习惯,而不是稍后优化代码(只要可读性不受阻碍)。
以下是您在每次迭代时创建新函数的证明:
var old;
function compare(_, a){
if (old) console.log('equal ?', old==a);
else old = a;
}
for (var i=0; i<2; i++){
compare(i, function(i) { return i*i });
}
记录'equal' ? false
答案 1 :(得分:3)
这就是你不想要的原因之一。该函数引用相同的变量。
var a = [];
for(var i=0; i<10; i++) {
a.push(function () {
return i;
});
}
h = "";
for(var j=0; j<10; j++) {
h += "" + a[j]();
}
alert(h);
人们可能会看到0123456789
,但它会将10
追加到h {10}。当一个函数可能改变其他函数的内容时,它可能使代码很难理解。
这是一个更复杂的例子,说明事情是如何出错的。
var a = [];
for(var i=0; i<10; i++) {
a.push(function () {
return i++;
});
}
h = "";
for(var j=0; j<10; j++) {
h += "" + a[j]();
}
alert(h);
创建函数时,它们指向相同的词法范围。执行该函数时,它们会更改函数内部的值,并且数组中的每个函数仍指向相同的值。当变量被修改但你没有直接修改它时,这可能导致非常难以调试的bug。
这里也是来自jslint本身的真正答案:http://jslinterrors.com/dont-make-functions-within-a-loop/