0

コードスニペットがあるとします:

dict = {"key":"elem"}
for (var elem in dict){
    someFunction(function(){
        anotherFunction(dict[elem]);
    })
}

elemその一時変数はfor...in...、その第 3 レベル、つまり で参照されたときに、ステートメントで作成されanotherFunction(dict[elem])ますか?

私のコードで呼び出されると、未定義を返すというエラーが表示されます。

this編集:どこかでキーワードを使用してこれを修正できますか?

4

4 に答える 4

1

匿名関数のクロージャーを作成しているため、変数の設定と使用の間で変数をどうするかによって異なります。

var dict = {
    "a": "aaaaaaaaa",
    "b": "bbbbbbbbb",
    "c": "ccccccccc"
};

for (var elem in dict) {
    someFunction(function() {
        anotherFunction(dict[elem]);
    })
}

function anotherFunction(a) {
    console.log(a);
}

非同期: 実際にコードを実行する前にループが実行elemされるため、セット内の最後のキーになります。最後のキーは数回使用されます。

function someFunction(f) {   
    setTimeout(f, 500);
}

同期: 各関数が順番に実行されるため、各値が出力されます

function someFunction(f) {
    f();
}
于 2012-07-02T23:06:29.960 に答える
0

elemあなたの問題は次のように定義されています:

dict[elem]

戻り値undefind

于 2012-07-02T22:55:19.850 に答える
0

任意のステートメント内に変数を作成すると、変数は最も近い親関数にスコープされます。これが JavaScript のしくみです。スコープは関数です。ただし、そこで使用できるはずなので、 gdoronelemが言ったように、問題は別の場所にあるはずです。

編集:

別の関数をパラメーターとして受け取る関数を呼び出しているようです。それは本当にあなたがやりたいことですか?

于 2012-07-02T22:58:36.010 に答える
0

dict変数を のスコープとして使用するには、その関数のスコープとしてanotherFunction参照する必要がありdictます。例:

for (var elem in dict) {
  someFunction(function(dict, elem) {
    return anotherFunction.call(dict, elem);
  }
}

あなたのanotherFunction構造では、thisキーワードの使用はdictオブジェクトを参照します。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

于 2012-07-02T23:04:44.533 に答える