JavaScript で、ループ内で関数を作成すると計算が無駄になる具体的な理由は何ですか?
JavaScript the Good Parts の 39 ページで、Douglas Crockford は次のように述べています。ループ内で関数を作成することが、外側よりも無駄になる理由がわかりません。
JavaScript で、ループ内で関数を作成すると計算が無駄になる具体的な理由は何ですか?
JavaScript the Good Parts の 39 ページで、Douglas Crockford は次のように述べています。ループ内で関数を作成することが、外側よりも無駄になる理由がわかりません。
Function
1 つだけを再利用するのではなく、複数のオブジェクトを作成しているためです。
同一関数の作成例...
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 つだけ作成します。
関数を作成すると、多くのリソースが使用される可能性があります。関数は実際にはオブジェクトであるため、コードは実際に毎回新しい関数オブジェクトを作成する必要があります。一度作成してから再利用することはできません。
通常、ループ内で関数を作成するということは、ループ外で単一の関数を作成するだけでなく、多くの関数を作成することを意味します。
したがって、ループ外で一度実行できる場合は、ループ内でリソースを集中的に使用することを行わないというだけの問題です。関数に関しては、多くの場合、コードのロジックを変更せずにループの外で作成できます。