3

JavaScript関数のリストを作成したいコードがあります。すべての関数は辞書に入れられdます。d["a"]関数を提供し、関数function() {console.log("a")}などd["b"]を提供しますfunction() {console.log("b")}。これは私のコードです:

var a = "abcdefghijklmnopqrstuvwxyz1234567890".split("");
var d = {};
for(var l = a.length, i = 0; i < l; i++)
{
    d[a[i]] = function(){console.log(a[i])};
}

ただし、上記のコードを実行するd["a"]d["b"]同じになり、すべてが を指しfunction(){console.log(a[i])}ます。欲しいものを手に入れるには?

ありがとう。

4

2 に答える 2

2

関数の各インスタンスに独自の変数を与える必要があります。

for(var l = a.length, i = 0; i < l; i++)
{
  (function (x) {
    d[a[x]] = function(){console.log(a[x])};
  })(i)
}
于 2013-10-02T19:08:47.293 に答える
0

それらは の同じインスタンスを指していませんfunction(){console.log(a[i])}。代わりに、すべてが への同じ参照を使用する一連の関数を作成しましたi。ループが実行されると、 atを指す値がi変化します。for

提供された他の回答は機能しますが、必要な関数を 2 倍生成する必要があります。

function makeLogFunction(whatToLog) {
    return function() {
        console.log(whatToLog);
    }
}

var a = "abcdefghijklmnopqrstuvwxyz1234567890";
var d = {};
for(var l = a.length, i = 0; i < l; i++) {
    d[a[i]] = makeLogFunction(a[i]);
}

ここに、makeLogFunction常に出力する新しい関数を返す がありますwhatToLog。他の答えは、ループが実行されるたびに makeLogFunction の新しい「バージョン」を生成します。非常に大きなデータ セットの場合、これは時間とメモリの無駄です。

このアプローチにより、明快さと再利用性という利点が追加されました。ループ内で大量のロジックが発生している場合は、それを名前付き関数にカプセル化すると、後でレビュー担当者が関数に付けた名前によって何が起こっているかを把握できます。アプリケーションの他の部分で関数を再利用することもできます。

于 2013-10-02T19:38:32.583 に答える