2017-04-26 70 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

用'let'替换for循环中的'var'。 – 2017-04-26 02:31:15

回答

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'已经有了它的最后一个值。 – 2017-04-26 02:30:44

+0

是的,它的工作原理: https://jsfiddle.net/jfren484/z8q8rud0/ – jfren484