Javascript最佳实践 - 哪里是在循环中定义辅助函数的最佳位置?

时间:2014-01-03 03:39:10

标签: javascript scope

这是一个更好的做法,这个:

myArray.forEach(function(item)) {

    doSomething(item);

    function doSomething(an_item) {
        console.log(an_item);   
    }

}

或者这个:

myArray.forEach(function(item)) {

    doSomething(item);

}

function doSomething(an_item) {
    console.log(an_item);   
}

第一个示例是创建函数的多个实例,还是第一次通过循环创建它?

感谢您的任何见解!

5 个答案:

答案 0 :(得分:4)

myArray.forEach(function(item)) {

    doSomething(item);

}

function doSomething(an_item) {
    console.log(an_item);   
}

这个功能最好,因为它只会创建一次;

myArray.forEach(function(item)) {

    doSomething(item);

    function doSomething(an_item) {
        console.log(an_item);   
    }

}
由于每次在循环过程中都会创建函数

是错误的

答案 1 :(得分:2)

第二个。使用第二种形式(因为第一种形式会降低用户的体验,可能是手机或低功耗设备),或者更短的形式

myArray.forEach(doSomething);

function doSomething(element, index, array) {
  console.log("myArray[" + index + "] = " + element);
}

答案 2 :(得分:2)

如果你问一个关于性能的纯粹问题,这真的取决于解释器,我会想象一些更聪明的问题就足够好,如果它们在循环期间永远不会改变,那么每次都不会创建和破坏函数,但实际上这就是什么你告诉它要做(每次创建函数,因为范围是临时的)所以如果是这样的话,不要感到惊讶。想象一下,如果你在forEach中动态创建一个闭包,那么每个循环都不需要创建一个新的函数副本吗?

http://jsperf.com/closure-vs-name-function-in-a-loop/2

certianly我会想象旧版浏览器不够智能,只知道只做一次。

另一篇文章:Don't make functions within a loop

答案 3 :(得分:2)

我同意其他人的说法,并对第二种解决方案+1。您不希望在循环中定义/创建函数。

**加成

如果你的功能与forloop中的对象有关,你可以在助手中使用 this ,而不是通过参数传递对象:

示例:

var myArray = [{ a: 1 }, { a: 2 }, { a: 3 }];

myArray.forEach(function(item) {
    doSomething.call(item);
});

function doSomething(item) {
    console.log(this.a);
}

答案 4 :(得分:-4)

优良作法是始终在尽可能小的范围内定义事物。

所以当你不需要其他地方的功能时,在使用它的循环中定义它是最好的选择。