2016-01-21 23 views
5

Dlaczego ten kod działa?Działający ciąg znaków jako funkcja w javascript setTimeout?

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

nie powinno być?

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

W jaki sposób setTimeout przekształcić ciąg do funkcji?

+3

Od [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout): * "kod w alternatywnej składni to ** ciąg kodu ** ty chcesz wykonać po upływie milisekund (użycie tej składni nie jest zalecane z tych samych powodów, co użycie 'eval()') "* –

+0

Ciekawe powiązany punkt widzenia [tutaj] (https://stackoverflow.com/q/3492015/465053). – RBT

Odpowiedz

6

Cytowanie kodu MDN za setTimeout documentation

w składni alternatywnej jest ciągiem kodu chcesz wykonać po milisekund opóźnienia (przy użyciu tej składni nie jest zalecany dla tych samych powodów, jak przy użyciu eval())

Zgodnie z sugestią zawartą w MDN, lepiej jest unikać ciągów znaków w setTimeout, ponieważ implementacja może eval przekazać ciąg znaków.


To nie jest tylko sprawa realizacja Browser, ale specyfikacja HTML sam określa to w ten sposób w this section

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

Harmonogramy timeout do skompilować i uruchomić kod po limitu czasu milisekund.

1

Zasadniczo specyfikacja umożliwia jej przejście w dowolną stronę, więc przeglądarki wykonają ją w dowolny sposób. Tak proste.

Nie zaleca się jednak, ponieważ używa on ciągu eval. Sposób działania jest lepszy.

2

docs dla firefox , IE

Jest przeznaczone zachowanie: można przekazać wskaźnik funkcji lub ciąg jako pierwszy argument.

Jeśli chodzi o sposób, w jaki to robi, JS jest językiem skryptowym, więc ocena łańcucha do kodu interpretowanego (np. Eval) jest tym, w czym jest bardzo dobra.

edit: Miałem na myśli "bardzo dobry w" w kontekście tego, że jest to język skryptowy, używany do analizowania ciągów do kodu roboczego, jak zauważa Jimbo Jonny; jest to coś, czego należy unikać.

+0

W rzeczywistości, eval'ing ciąg do kodu jest czymś, co zmusza go do rezygnacji z kilku optymistycznych korzyści, zwalniając nie tylko tę linię, ale wiele innych operacji w ramach kodu. To nie jest coś, w czym jest dobre. W rzeczywistości jest to coś bardzo ubogiego i powinno się go unikać, gdy tylko jest to możliwe. –