で2つの機能で同じ変数を使用して、我々がやろうとしているものである:は、ここではJavaScript
$(document).ready(function()
{
for (var i = 0; i < 10; i++)
{
for (var j = 0; j < 15; j++)
{
$('#Row'+(i+1)+'Sub' + (j+1) + '_ClientDropDown').ready(function()
{ TrimServices_Function("Row" + (i+1) + "_Sub" + (j+1).ToString() + "_ClientDropDown"); })
}
}
})
残念ながら、Javascriptが本当に正しく第二の機能にiとjを渡しません。他のテストで警告を行う場合には、右の最初の呼び出しで行を作成しますが、その後、他の部分はわずか10と15を返しますので、5行目のサブ7は以下のようになり言うことができます:
$('#Row5Sub7_ClientDropDown').ready(function()
{ TrimServices_Function("Row11_Sub16_ClientDropDown"); })
私たちが作って行くだろうか行とサブが一致する行をループすることを確認してください。
それが正しく動作しています。ループのたびに値を変更する変数のクロージャを作成しています。したがって、関数が後で実行するときの変数の値は、関数がready()に渡された時点の値ではなく、それらの変数の最終値を取得することです。それはクロージャの正しい振る舞いです。 – RJM
ここにこの問題の答えがあります:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – RJM
forループで 'var'を' let'に置き換えてください。 –