2017-04-26 6 views
1

Hier ist, was wir versuchen zu tun:Unter Verwendung der gleichen Variablen in zwei Funktionen in 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"); }) 

       } 
      } 
    }) 

Leider ist Javascript nicht wirklich die i und j in die zweite Funktion korrekt übergeben. Wenn Warnungen in anderen Tests tun erstellt es eine Linie mit der rechten ersten Anruf, aber dann der andere Teil gibt nur 10 und 15 können also sagen, Linie 5 sub 7 wäre:

$('#Row5Sub7_ClientDropDown').ready(function() 
    { TrimServices_Function("Row11_Sub16_ClientDropDown"); }) 

Wie würden wir gehen darum, sicher, dass wir Linien durchlaufen, wo die Reihe und Unter übereinstimmen?

+1

Es ist richtig funktioniert. Sie erstellen eine Schließung für Variablen, die ihre Werte jedes Mal durch die Schleifen ändern. Der Wert dieser Variablen bei der späteren Ausführung der Funktion erfasst also den endgültigen Wert dieser Variablen und nicht den Wert zu dem Zeitpunkt, zu dem die Funktion an ready() übergeben wurde. Das ist das richtige Verhalten für Verschlüsse. – RJM

+0

Hier ist eine Antwort auf dieses Problem: http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – RJM

+0

Ersetzen Sie 'var' in Ihren for-Schleifen mit' Let'. –

Antwort

0

Set beide Strings außerhalb der Funktion innerhalb des zweiten for-Schleife wie folgt aus (ich würde auch Ihre String-Verkettung aufzuräumen, aber ich habe es, wie Sie es hier hatte):

 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

Andere Empfehlungen - anstatt Schleifen von 0 bis 9 oder 14 und dann jedes Mal 1 zu i und j hinzufügen, Schleife von 1 bis 10 bzw. 15. Es wäre viel sauberer. Und wählen Sie einfache oder doppelte Anführungszeichen und gehen Sie mit. Wechseln Sie nicht hin und her. – jfren484

+0

Haben Sie dies überprüft, um sicherzustellen, dass es funktioniert? Ich denke, zu dem Zeitpunkt, zu dem die interne Funktion aufgerufen wird, hat "selectorB" bereits seinen letzten Wert. –

+0

Ja, es funktioniert: https://jsfiddle.net/jfren484/z8q8rud0/ – jfren484

Verwandte Themen