1

重複の可能性:
Javascriptの悪名高いループの問題?

私は次のコードを持っています:

function test() {

   var columns = options.columns;

for (var i =0; i < columns.length; i++) {
    if (columns[i].type === "number") {
        var field = columns[i].field;
        columns[i].footerTemplate = function(data) { return buildFooter(data, field);     };
      }
  }
}

function buildFooter(data, field) {
   alert(field);
 }

ライブラリ関数はfooterTemplate関数を呼び出します(次にbuildFooterを呼び出します)。buildFooterのアラートは、フィールドが常に同じ値(テストのforループで繰り返される最後の値)であることを示しています。適切なフィールド値を使用してbuildFooterを呼び出すにはどうすればよいですか(つまり、

 columns[0].footerTemplate = function(data) { return buildFooter(data, columns[0].field);} 

 columns[1].footerTemplate = function(data) { return buildFooter(data, columns[1].field);}

等々...

4

3 に答える 3

4

Javascriptは、論理ブロック(loops、ifs)内の変数をスコープしません。その変数は、すべてのプロパティfieldで共有されます。footerTemplate

これを解決するには、インライン関数を作成してスコープを作成します。

for (var i =0; i < columns.length; i++) {
    if (columns[i].type === "number") {
      (function () {
          var field = columns[i].field;
          columns[i].footerTemplate = function(data) { 
            return buildFooter(data, field);
          };
      })();
    }
  }
}
于 2012-12-04T21:10:33.957 に答える
2

試す:

columns[i].footerTemplate = (function(field) {
    return function (data) {
        buildFooter(data, field);
    };
})(field);

field正しくバインドされた変数を持つ新しい関数を返す関数をすぐに実行します。これは間違いなくループの問題であるスコープの問題であるため、すぐに呼び出される関数を使用して新しいスコープを作成し、正しい変数を使用できるようにします。これは間違いなくJavascriptの悪名高いループの問題の複製ですか?けれど

于 2012-12-04T21:06:07.187 に答える
0

Javascriptは関数スコープの言語であるため、

field 

forループ内の変数は、foorループ外で宣言したものと同じです。同じ変数を何度も上書きしているだけです。すべてのループでフィールド変数に割り当てられたメモリはなく、書き込まれているのは1つの同じメモリ空間です。

于 2012-12-04T21:10:42.007 に答える