2016-06-30 3 views
1

Ich habe eine Reihe von Elementen, es ist bestückt, aber alle Mitglieder sind undefined.Mitglied des Arrays ist undefined, hat alle Daten, um das Mitglied

// Result: [div.some-class, div.some-class, div.some-class, div.some-class] 
console.log(myArray); 

// Result: 4 
console.log(myArray.length); 

for(var i = 0 ; i < myArray.length; i++) { 
    setTimeout(function() { 

     console.log(myArray[i]); // <- This is "undefined" 
     console.log(myArray); // <- Successful log: has access to array 
     console.log(i);   // <- Successful log: has access to "i" 

     // Uncaught TypeError: Cannot read property 'classList' of undefined 
     myArray[i].classList.add('yeah'); 

    }, i * 200); 
} 

Es funktioniert ohne Timeout:

for(var i = 0 ; i < myArray.length; i++) { 
    // No errors -> it works 
    myArray[i].classList.add('yeah'); 
} 

myArray ist ein globaler Wert und Timeout hat Zugriff auf alle Daten, die er braucht. Warum ist es immer noch undefiniert?

+0

Der Wert der Variablen "i" ist nach dem letzten Element, wenn diese Funktionen tatsächlich ausgeführt werden. Ihre 'for'-Schleife wird beendet, bevor sie ausgeführt wird! Wie Sie gesehen haben sollten, ist der Wert von "i" in Ihrer Ausgabe immer 4, was der Wert nach dem Schleifenabschluss ist. –

Antwort

1

Wenn die Timeout-Funktion aufruft, hat die Schleife beendet bereits, was bedeutet, die i bis 4.

gleich ist hier eine einfache Lösung:

for(var i = 0 ; i < myArray.length; i++) { 
    (function(i) { 
     setTimeout(function(i) { 

      myArray[i].classList.add('yeah'); 

     }, i * 200) 
    })(i); 
} 

Sie einfach mit jeder den Timeout aufrufen i und übergeben Sie diese i an die Funktion

+0

Da ist ein ')' irgendwo fehlt und ich kann nicht den richtigen Ort herausfinden .. :-D – Solo

+0

yup. hinzugefügt die fehlende ')' –

+0

Bereits versucht es vorher, immer noch den Fehler in ') (i);' Bereich. Fehler: 'setTimeout (...) ist keine Funktion' – Solo

Verwandte Themen