Uczę się JavaScript i ostatnio dowiedziałem się o zdarzeniach JavaScript. Kiedy dowiedziałem się o setTimeout
co W3Schools , zauważyłem dziwną postać, która nie uruchamiać się wcześniej. Używają podwójnych cudzysłowów, a następnie wywołują funkcję.
Przykład:
setTimeout("alertMsg()", 3000);
Wiem, że podwójne i pojedyncze cudzysłowy w JavaScript oznaczają ciąg znaków.
Widziałem też, że mogę zrobić to samo:
setTimeout(alertMsg, 3000);
Z nawiasami, do których się odnosi, bez nawiasów jest kopiowany. Kiedy używam cytatów i nawiasów, robi się szalony.
Będę zadowolony, jeśli ktoś może wyjaśnić mi różnicę między tymi trzema sposobami użycia setTimeout
:
Z nawiasami:
setTimeout("alertMsg()", 3000);
Bez cytatów i nawiasów:
setTimeout(alertMsg, 3000);
A trzeci używa tylko cudzysłowów:
setTimeout("alertMsg", 3000);
Uwaga: Lepszym źródłem setTimeout
odniesienia będzie MDN .
javascript
settimeout
użytkownik1316123
źródło
źródło
mysql_
rozszerzenie PHP), których strumień pytań SO jest tylko przykładem. IIRC wystąpiły również bardzo subtelne błędy w sekcji SQL, ale minął prawie rok od ostatniej wizyty na stronie i wiele z nich może być naprawionych. I nawet jeśli wszystko powyższe byłoby idealne, nadal nie promowałbym strony internetowej, która próbuje oszukać ludzi za pomocą oszustwa związanego z ich certyfikatem.Odpowiedzi:
Za pomocą
setInterval
lubsetTimeout
Powinieneś przekazać odwołanie do funkcji jako pierwszy argument dla
setTimeout
lubsetInterval
. Odniesienie to może mieć postać:Anonimowa funkcja
Nazwa istniejącej funkcji
Zmienna wskazująca na istniejącą funkcję
Zauważ, że ustawiam „zmienną w funkcji” oddzielnie od „nazwy funkcji”. Nie jest oczywiste, że nazwy zmiennych i funkcji zajmują tę samą przestrzeń nazw i mogą się wzajemnie blokować.
Przekazywanie argumentów
Aby wywołać funkcję i przekazać parametry, możesz wywołać funkcję wewnątrz wywołania zwrotnego przypisanego do timera:
Istnieje inna metoda przekazywania argumentów do modułu obsługi, jednak nie jest on zgodny z różnymi przeglądarkami .
Kontekst oddzwaniania
Domyślnie kontekst wywołania zwrotnego (wartość
this
funkcji wywoływanej przez stoper) podczas wykonywania jest obiektem globalnymwindow
. Jeśli chcesz to zmienić, użyjbind
.Bezpieczeństwo
Chociaż jest to możliwe, nie należy przekazywać łańcucha do
setTimeout
lubsetInterval
. Przechodząc ciąg sprawia,setTimeout()
lubsetInterval()
użyć funkcji podobnej doeval()
że wykonuje ciągi jako skrypty , czyniąc wykonanie arbitralny i potencjalnie szkodliwy skrypt możliwe.źródło
myślę, że funkcja setTimeout, którą piszesz, nie jest uruchamiana. jeśli używasz jquery, możesz ustawić, aby działała poprawnie, wykonując następujące czynności:
źródło
Całkowicie zgadzam się z Józefem.
Oto skrzypce, aby to przetestować: http://jsfiddle.net/nicocube/63s2s/
W kontekście skrzypce argument string nie działa, moim zdaniem, ponieważ funkcja nie jest zdefiniowana w zasięgu globalnym.
źródło
Co dzieje się w rzeczywistości w przypadku podania ciągu jako pierwszego parametru funkcji
jest oceniana wartość pierwszego parametru, kiedy nadszedł czas uruchomienia (po upływie
number
milisekund). Zasadniczo jest to równeTo jest
Próbki, do których się odwołujesz, nie są dobrymi próbkami i mogą być podane w innym kontekście lub po prostu literówką.
Jeśli wywołujesz w ten sposób
setTimeout(something, number)
, pierwszym parametrem nie jest ciąg, ale wskaźnik do czegoś zwanegosomething
. I znowu, jeślisomething
jest ciągiem - wtedy zostanie to ocenione. Ale jeśli jest to funkcja, funkcja zostanie wykonana. próbka jsbinźródło
źródło
Z nawiasami:
Bez cytatów i nawiasów:
A trzeci używa tylko cudzysłowów:
źródło