3

次のパラメーター化 (変更できません) を持つ関数を使用しています。

my_function(data, callback_function(results, status) {});

「data」(callback_function が使用する)、「results」、または「status」に追加できない追加情報を callback_function に渡す必要があります。具体的には、この情報は my_function 呼び出しが含まれる for ループのカウンターです。

これを行うには、callback_function の本体内にカウンターへの参照を含めます。

for(var i = 0; i < 10; i++) {

  var data = 'cannot modify this data';

  my_function(data, function (results, status) { alert(i); });

}

残念ながら、i の最終値 (この場合は 9) は 10 回出力されています。意図された動作は、ループ内の i の各値 (0 から 9) が出力されることです。

動的関数がスコープ外の変数にアクセスすることは可能ですが、それらが定義されているスコープ内にありますか?

4

3 に答える 3

6

無名関数が作成された時点での値を含むクロージャを作成する必要があります。そのためにラッパー関数を使用できます。i

function createClosure(x, func) {
  return function(results, status) { func(x, results, status); }
}

/* ... */

for(var i = 0; i < 10; i++) {
  var data = 'cannot modify this data';
  my_function(data, createClosure(i, function(i, results, status) { 
    alert(i);
    alert(results);
    alert(status);
  }));
}

または、短くしたい場合は、その場でクロージャーを作成できます。

for(var i = 0; i < 10; i++) {
  var data = 'cannot modify this data';
  my_function(data, (function(i) {
    return function (results, status) { 
      alert(i); 
    }
  })(i));
}
于 2012-02-07T00:32:17.080 に答える
1

必要なのはFunction.prototype.bindです。これを使用して、関数を特定のパラメーターにバインドできます。これを行うと、コードは次のようになります。

for(var i = 0; i < 10; i++) {

  var data = 'cannot modify this data';

  function callback(iValue, results, status) { alert(iValue); }
  my_function(data, callback.bind(null, i)); // |null| since you don't seem to need any specific |this|.

}
于 2012-02-07T19:37:06.163 に答える
0
for(var i = 0; i < 10; i++) {

var data = 'cannot modify this data';

my_function(data, function (results, status) { 
 alert( 
  function(value){ 
    return value;
    }(i);
 )
}   //function (results, status)  ends here
);  // myfunction ends here..

}

テストはしていませんが、試してみてください。うまくいくことを願っています。

このリンク-> Javascriptクロージャ-変数スコープの質問 をチェックして、何をしているのかをよりよく理解してください。

于 2012-02-07T19:52:18.977 に答える