循环中的函数,为什么它们被认为是'错误'

时间:2014-02-02 12:01:20

标签: javascript

对于在循环中声明的复杂函数,我可以看到为什么我不想这样做,但为什么它会被认为是错误的javascript?

我们可以将该函数命名并将其置于循环之外,但是为简单(无异步)的事物扰乱了流程。

例如,下面是一个循环中的简单内联函数声明(JSHINT / LINT抱怨,为什么这被认为是不行?

for (var i = 0, len=arr.length; i < len; ++i) {

     dosomething(arr[i], function(returnvalue) {
         console.log(returnvalue);
     });

};

2 个答案:

答案 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

testable jsbin

答案 1 :(得分:3)

这就是你不想要的原因之一。该函数引用相同的变量。

http://jsfiddle.net/RCzyF/

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/

相关问题