Saya belajar JavaScript dan saya baru-baru ini belajar tentang peristiwa waktu JavaScript. Ketika saya belajar tentang setTimeout
di W3Schools , saya melihat sosok aneh yang tidak saya temui sebelumnya. Mereka menggunakan tanda kutip ganda dan kemudian memanggil fungsinya.
Contoh:
setTimeout("alertMsg()", 3000);
Saya tahu bahwa tanda kutip ganda dan tunggal dalam JavaScript berarti string.
Saya juga melihat bahwa saya dapat melakukan hal yang sama seperti itu:
setTimeout(alertMsg, 3000);
Dengan tanda kurung itu merujuk, tanpa tanda kurung itu disalin. Ketika saya menggunakan tanda kutip dan tanda kurung itu menjadi gila.
Saya akan senang jika seseorang dapat menjelaskan kepada saya perbedaan antara tiga cara menggunakan ini setTimeout
:
Dengan tanda kurung:
setTimeout("alertMsg()", 3000);
Tanpa tanda kutip dan tanda kurung:
setTimeout(alertMsg, 3000);
Dan yang ketiga hanya menggunakan tanda kutip:
setTimeout("alertMsg", 3000);
NB: Sumber setTimeout
referensi yang lebih baik adalah MDN .
sumber
mysql_
ekstensi PHP) di mana aliran pertanyaan SO hanyalah sebuah contoh. IIRC ada beberapa kesalahan yang sangat halus di bagian SQL juga, tapi sudah hampir setahun sejak terakhir kali saya mengunjungi situs web dan banyak dari mereka mungkin juga diperbaiki. Dan bahkan jika semua di atas sempurna saya masih tidak akan mempromosikan situs web yang mencoba menipu orang dengan penipuan sertifikat mereka.Jawaban:
Menggunakan
setInterval
atausetTimeout
Anda harus memberikan referensi ke fungsi sebagai argumen pertama untuk
setTimeout
atausetInterval
. Referensi ini dapat berupa:Fungsi anonim
Nama fungsi yang ada
Variabel yang menunjuk ke fungsi yang ada
Perhatikan bahwa saya mengatur "variabel dalam suatu fungsi" secara terpisah dari "nama fungsi". Tidak jelas bahwa variabel dan nama fungsi menempati namespace yang sama dan dapat saling mengalahkan.
Melewati argumen
Untuk memanggil suatu fungsi dan melewatkan parameter, Anda dapat memanggil fungsi di dalam callback yang ditugaskan ke penghitung waktu:
Ada metode lain untuk meneruskan argumen ke dalam handler, namun itu tidak kompatibel lintas-browser .
Konteks panggilan balik
Secara default, konteks panggilan balik (nilai
this
di dalam fungsi yang disebut oleh timer) ketika dieksekusi adalah objek globalwindow
. Jika Anda ingin mengubahnya, gunakanbind
.Keamanan
Meskipun mungkin, Anda tidak boleh melewatkan string ke
setTimeout
atausetInterval
. Melewati string membuatsetTimeout()
atausetInterval()
menggunakan fungsi yang mirip denganeval()
yang mengeksekusi string sebagai script , membuat sewenang-wenang dan berpotensi membahayakan eksekusi script mungkin.sumber
saya pikir fungsi setTimeout yang Anda tulis tidak dijalankan. jika Anda menggunakan jquery, Anda dapat membuatnya berjalan dengan benar dengan melakukan ini:
sumber
Sepenuhnya setuju dengan Joseph.
Berikut ini biola untuk menguji ini: http://jsfiddle.net/nicocube/63s2s/
Dalam konteks biola, argumen string tidak berfungsi, menurut saya karena fungsinya tidak didefinisikan dalam lingkup global.
sumber
Apa yang terjadi dalam kenyataan jika Anda melewatkan string sebagai parameter fungsi pertama
adalah nilai param pertama yang dievaluasi ketika saatnya untuk dijalankan (setelah
number
milidetik berlalu). Pada dasarnya itu sama denganIni adalah
Jadi sampel yang Anda referensikan bukan sampel yang baik, dan dapat diberikan dalam konteks yang berbeda atau hanya kesalahan ketik sederhana.
Jika Anda memanggil seperti ini
setTimeout(something, number)
, parameter pertama bukan string, tetapi penunjuk ke sesuatu yang disebutsomething
. Dan lagi jikasomething
string - maka akan dievaluasi. Tetapi jika itu adalah fungsi, maka fungsi akan dieksekusi. sampel jsbinsumber
sumber
Dengan tanda kurung:
Tanpa tanda kutip dan tanda kurung:
Dan yang ketiga hanya menggunakan tanda kutip:
sumber