2012-12-12 20 views
5

Der folgende Code wird in dem Buch Head First jQuery dargestellt.Variable nicht definiert, manchmal

function lightning_one(t) { 
$("#lightning1").fadeIn(250).fadeOut(250); 
setTimeout("lightning_one()", t); 
}; // end lightning_one 

Es wird mit dieser Zeile aufgerufen.

lightning_one(3000); 

Das beobachtete Verhalten ist, dass der Blitz blendet und aus einmal, wartet 3 Sekunden eingeblendet und wieder heraus, und dann weiter in die und aus verblassen. Firebug zeigt keine JavaScript-Fehler.

Ich verstehe, warum ich sehe, was ich sehe. Ich dachte, ich würde versuchen, die 3-Sekunden-Intervall zu erhalten, also habe ich dies:

setTimeout("lightning_one()", t); // nothing in the brackets 

dazu:

setTimeout("lightning_one(t)", t); // t is in the brackets 

Wenn ich die Seite aktualisieren, blendet der Blitz in die und aus einmal. Firebug sagt mir, dass die Variable t nicht definiert ist.

Meine Frage ist, wenn die Variable t nicht nach meiner Änderung definiert ist, wie lief der Befehl ohne Fehler, bevor ich es änderte? Es hat immer noch eine Variable namens t.

Mehr Infos

Vielen Dank an alle, die Kommentare und Antworten geschrieben. Für die Aufzeichnung in dem „Ende“ -Ordner, wird der Code folgendermaßen aus:

lightning_one(); 

    function lightning_one(){ 
$("#container #lightning1").fadeIn(250).fadeOut(250); 
setTimeout("lightning_one()",4000); 
    }; 

Ich habe nicht das geltende Kapitel abgeschlossen noch so weiß ich nicht, wenn der Code Änderung später vorgeschlagen wird. Wie bereits erwähnt, ist dies vielleicht nicht das beste Buch da draußen. Aber es ist die, die ich gekauft habe und ich lerne die Grundlagen von jQuery daraus.

+4

Sie übergeben wirklich eine Zeichenfolge an 'setTimeout'? Wirf das Buch weit weg. – Bergi

+0

Ich dachte das gleiche: Ich dachte, Funktionen auf diese Weise aufzurufen war eine schlechte Übung ... Nicht etwas, das in einem Buch gelehrt werden sollte! – jahroy

+0

Ich sah viele Worte in diesem Sinne, als ich versuchte, die Antwort alleine zu finden. Der Aufruf der Funktion ohne Anführungszeichen war eine meiner erfolglosen Bemühungen. Für den Zweck meiner Frage dachte ich jedoch, ein genaues Zitat wäre der beste Weg zu gehen. –

Antwort

6

Da das erste Argument setTimeout als Zeichenfolge ist eval -ed, was bedeutet, dass es in den äußeren Bereich der Funktion, in der t nicht definiert ist. Der erste ist in Ordnung, weil Sie keine Variablen im Aufruf verwenden, aber der zweite ist nicht, weil t nicht außerhalb des Bereichs der Funktion definiert ist. Es ist in der Tat lokal.

Hinweis: Verwenden Sie eval überhaupt nicht. Tatsächlich benötigen Sie das String-Argument nicht. Verwenden Ausdruck eine Funktion:

setTimeout(function() { 

    lightning_one(t); 

}, t); 
2

Diese wird Arbeit:

setTimeout(function() { lightning_one(t); }, t); 

Ich bin mir ziemlich sicher, dass eine Funktion aus einem String aufrufen (und lässt sie bekommen ausgewertet) ist eine schlechte Praxis, die sein sollte vermieden werden.

+0

Diese Antwort hat tatsächlich funktioniert. –

Verwandte Themen