4

JavaScript で、ループ内で関数を作成すると計算が無駄になる具体的な理由は何ですか?

JavaScript the Good Parts の 39 ページで、Douglas Crockford は次のように述べています。ループ内で関数を作成することが、外側よりも無駄になる理由がわかりません。

4

2 に答える 2

5

Function1 つだけを再利用するのではなく、複数のオブジェクトを作成しているためです。

同一関数の作成例...

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); };
}

2 つの例の結果は同じですが、2 番目の例では、ループ中に 2 つの関数を作成するオーバーヘッドは必要ありません。代わりに、ハンドラーを 1 つだけ作成します。

于 2012-05-31T13:39:57.507 に答える
2

関数を作成すると、多くのリソースが使用される可能性があります。関数は実際にはオブジェクトであるため、コードは実際に毎回新しい関数オブジェクトを作成する必要があります。一度作成してから再利用することはできません。

通常、ループ内で関数を作成するということは、ループ外で単一の関数を作成するだけでなく、多くの関数を作成することを意味します。

したがって、ループ外で一度実行できる場合は、ループ内でリソースを集中的に使用することを行わないというだけの問題です。関数に関しては、多くの場合、コードのロジックを変更せずにループの外で作成できます。

于 2012-05-31T13:42:21.280 に答える