Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么?_Javascript_Loops_Computation - Fatal编程技术网

在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么?

在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么?,javascript,loops,computation,Javascript,Loops,Computation,在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么 Douglas Crockford在JavaScript的第39页指出,“避免在循环中创建函数,这可能会造成计算上的浪费”。我似乎不明白为什么在循环内创建函数比在循环外创建函数更浪费。因为您正在创建多个函数对象,而不是只重用一个 创建相同函数的示例 for (var i = 0; i < 10; i++) { // v--creating identical function in each iteration

在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么


Douglas Crockford在JavaScript的第39页指出,“避免在循环中创建函数,这可能会造成计算上的浪费”。我似乎不明白为什么在循环内创建函数比在循环外创建函数更浪费。

因为您正在创建多个
函数
对象,而不是只重用一个

创建相同函数的示例

for (var i = 0; i < 10; i++) {
    // v--creating identical function in each iteration.
    (function(j) {
        var el = document.createElement('a');
        el.onclick = function() { alert(j); };
        document.body.appendChild(el);
    })(i);
}
for (var i = 0; i < 10; i++) {
    var el = document.createElement('a');
      // ----------v---calling a reusable function
    el.onclick = createHandler(i);
    document.body.appendChild(el);
}

function createHandler(j) {
    return function() { alert(j); };
}
for(变量i=0;i<10;i++){
//v——在每次迭代中创建相同的函数。
(职能(j){
var el=document.createElement('a');
el.onclick=function(){alert(j);};
文件.正文.附件(el);
})(i) );
}
重用命名函数的示例

for (var i = 0; i < 10; i++) {
    // v--creating identical function in each iteration.
    (function(j) {
        var el = document.createElement('a');
        el.onclick = function() { alert(j); };
        document.body.appendChild(el);
    })(i);
}
for (var i = 0; i < 10; i++) {
    var el = document.createElement('a');
      // ----------v---calling a reusable function
    el.onclick = createHandler(i);
    document.body.appendChild(el);
}

function createHandler(j) {
    return function() { alert(j); };
}
for(变量i=0;i<10;i++){
var el=document.createElement('a');
//------------v---调用可重用函数
el.onclick=createHandler(i);
文件.正文.附件(el);
}
函数createHandler(j){
返回函数(){alert(j);};
}

这两个示例的结果相同,但第二个示例不需要在循环期间生成两个函数的开销。相反,它只创建一个处理程序。

创建函数会占用大量资源。由于函数实际上是对象,因此代码每次都必须实际创建一个新的函数对象,它不能只创建一次,然后再重用它

在循环内创建函数通常意味着您将创建许多函数,而不仅仅是在循环外创建单个函数


所以,如果你能在循环外做一次,那就是不要在循环内做资源密集型的事情。当涉及到函数时,它们通常可以在循环之外创建,而不改变代码的逻辑。

可能的重复?(这个讨论确实很有趣)在javascript中,函数是一级对象,所以当您使用函数表达式时,它总是创建一个新的函数对象。如果使用函数声明(与其他语言相比更具可比性),则该声明将被提升,甚至不会在循环中运行。@Esailija:除非您不应将函数声明放在循环的语句块中(即使某些实现仍将提升它)。它需要在循环之前或之后执行。@amnotiam true,只是为了“彻底性”而提到它:p很好的例子,代码有一种比文字更好的解释方式!非常感谢。