2016-01-21 25 views
5

Warum funktioniert dieser Code?Laufender String als Funktion in Javascript setTimeout?

setTimeout("document.body.innerHTML = 'TEST'", 1000)

Sollte es nicht sein?

setTimeout(function() { 
    document.body.innerHTML = 'TEST' 
}, 1000) 

Wie setTimeout convert Zeichenfolge zu funktionieren?

+3

Von [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout): * "Code in der alternativen Syntax ist ** eine Zeichenfolge von Code ** Sie will nach Verzögerung Millisekunden auszuführen "* –

+0

Ein interessanter ähnliche Ansicht Punkt [hier] (diese Syntax verwendet, wird nicht aus den gleichen Gründen wie mit' eval() 'empfohlen) (https://stackoverflow.com/q/3492015/465053). – RBT

Antwort

6

setTimeout documentation

Code in der alternativen Syntax des MDN Zitiert ist eine Reihe von Code, den Sie nach einer Verzögerung Millisekunden ausgeführt werden sollen (diese Syntax nicht als mit eval() aus den gleichen Gründen empfohlen)

wie bereits angedeutet in der MDN, es besser ist, Strings in der setTimeout zu vermeiden, da die Implementierung übergeben die Zeichenfolge eval kann.


Dies ist nicht nur ein Browser Implementierung Sache, aber die HTML-Spezifikation selbst definiert es auf diese Weise this section in

handle = window . setTimeout(code [, timeout ]) 

Termine ein Timeout Kompilieren und Ausführen von Code nach Timeout Millisekunden.

1

Grundsätzlich erlaubt die Spezifikation, dass es so oder so gehen kann, so dass die Browser es in beide Richtungen nehmen werden. So einfach.

Nicht obwohl empfohlen, weil es verwendet eval auf der Saite. Der Funktionsweg ist der bessere Weg.

2

docs für firefox , IE

Es Verhalten bestimmt ist: Sie einen Funktionszeiger oder eine Zeichenfolge als erstes Argument übergeben kann.

Was, wie sie es tut, ist JS eine Skriptsprache, die Bewertung so eine Zeichenfolge einige Code interpretiert (wie eval tut) ist, was es zu sehr gut ist.

edit: Ich meinte, ‚sehr gut‘ im Zusammenhang mit der es sich um eine Skriptsprache, verwendete Zeichenketten zu analysieren Code zu arbeiten, als Jimbo Jonny weist darauf hin; es ist etwas zu vermeiden.

+0

Eigentlich ist eine Zeichenfolge Code eval'ing etwas, das sie zwingt, eine Reihe von anderen Nutzen für Optimierungen zu verzichten, verlangsamt nur nach unten nicht, dass die Linie, sondern auch viele andere Vorgänge innerhalb des Codes. Es ist nicht etwas, in dem es gut ist. Es ist tatsächlich etwas, woran es sehr schlecht ist, und sollte wo möglich vermieden werden. –