2017-04-26 4 views
1

で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"); }) 

私たちが作って行くだろうか行とサブが一致する行をループすることを確認してください。

+1

それが正しく動作しています。ループのたびに値を変更する変数のクロージャを作成しています。したがって、関数が後で実行するときの変数の値は、関数がready()に渡された時点の値ではなく、それらの変数の最終値を取得することです。それはクロージャの正しい振る舞いです。 – RJM

+0

ここにこの問題の答えがあります:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – RJM

+0

forループで 'var'を' let'に置き換えてください。 –

答えて

0

設定し、このようなループのための第二の内側の関数の外側の両方の文字列(あなたがそれをここに持っていたとして、私はまた、あなたの文字列の連結をクリーンアップするだろうが、私はそれを左):

 for (var i = 0; i < 10; i++) 
     { 
      for (var j = 0; j < 15; j++) 
      { 
       var selectorA = '#Row'+(i+1)+'Sub' + (j+1) + '_ClientDropDown'; 
       var selectorB = "Row" + (i+1) + "_Sub" + (j+1).ToString() + "_ClientDropDown"; 

       $(selectorA).ready(function() 
        { TrimServices_Function(selectorB); }) 

      } 
     } 
+0

その他の推奨事項 - 0から9または14までループし、毎回iとjに1を加算する代わりに、それぞれ1から10と15までループします。それはずっときれいだろう。そして、一重引用符や二重引用符を選んで、それと一緒に行く。前後に切り替えないでください。 – jfren484

+0

これをチェックして問題なく動作していることを確認しましたか?内部関数が呼び出された時点で、 'selectorB'はすでにその最後の値を持っていると思います。 –

+0

うん、それは動作します: https://jsfiddle.net/jfren484/z8q8rud0/ – jfren484

関連する問題