2016-03-25 11 views
0

Ich bin eine wirklich harte Zeit mit Funktion von JavaScript ist, und ich werde es mit diesem Stück Code erklären (lässt patients Größe sagen 3):Funktionen im Inneren für Schleifen - wie es richtig geht?

for(j=0; j<patients.length; j++){ 
      console.log("before function - "+j); 
      DButils.getDaysLeft(patients[j] , function(daysLeft){ 
       console.log("inside function - "+j); 
      }); 
      console.log("end - "+j); 
     } 

Dies ist die Ausgabe erhalte ich:

before function - 0 
end - 0 
before function - 1 
end - 1 
before function - 2 
end - 2 
inside function - 3 
inside function - 3 
inside function - 3 

wegen dieses Problem, wenn ich patients[j] innerhalb der Funktion tun immer es gibt mir undefined, offensichtlich, weil die Patienten nur in der Größe von 3

ist ich verstehe, dass Die Funktion funktioniert als Thread und daher endet die Schleife, bevor wir den Rückruf der Funktion eingeben, aber wie löse ich sie? Was kann ich tun, damit es wie eine normale "for-Schleife" funktioniert, wie c# oder java würde mit diesem Stück Code arbeiten?

+0

Willkommen bei JS. Du musst sehr verwirrt gewesen sein. Machen Sie die 'function (daysLeft) {console.log (" innerhalb Funktion - "+ j)}' Funktionsdefinition ein IIFE und speichern Sie 'j' unter einer Schließung. Wie '(function (daysLeft) {console.log (" innerhalb Funktion - "+ j)}) (j);' – Redu

Antwort

2

JavaScript haben function Ebene Umfang nicht block Ebene Umfang.

Verwenden Sie closure, es merkt sich den Wert einer Variablen, in der es erstellt wird.

Versuchen Sie folgendes:

for (j = 0; j < patients.length; j++) { 
 
    console.log("before function - " + j); 
 
    DButils.getDaysLeft(patients[j], (function(j) { 
 
    return function(daysLeft) { 
 
     console.log("inside function - " + j); 
 
    } 
 
    })(j)); 
 
    console.log("end - " + j); 
 
}

+0

Sollte ich die "getDaysLeft" -Signatur bearbeiten, damit es funktioniert? –

+0

No.Closure gibt die innere Funktion zurück, die Ihr Callback sein wird, und wird später aufgerufen, wenn Ihr Callback funktioniert ... – Rayon

+0

Danke, es funktioniert, ich werde als Antwort markieren, sobald ich kann. –

Verwandte Themen