Rumah >hujung hadapan web >tutorial js >Fungsi JavaScript SetTimeout: Panduan dengan contoh
Penjelasan fungsi: Melaksanakan pelaksanaan tertunda setTimeout
adalah fungsi asli dalam JavaScript yang digunakan untuk memanggil fungsi atau melaksanakan coretan kod selepas kelewatan yang ditentukan (milisaat). Ini berguna dalam banyak senario, seperti memaparkan tetingkap pop timbul selepas pengguna melayari halaman untuk seketika, atau menambah kelewatan ringkas sebelum mengeluarkan kesan hover elemen (mencegah salah operasi). setTimeout
Fungsi
setTimeout
setTimeout
setTimeout
setTimeout
berjalan dalam konteks pelaksanaan yang berbeza daripada fungsi yang memanggilnya, yang boleh menyebabkan masalah apabila konteks kata kunci this
adalah penting. Ini boleh diselesaikan dengan menggunakan fungsi perpustakaan this
, atau fungsi anak panah. bind
Nilai pulangan setTimeout
. clearTimeout
Blok kod berikut menunjukkan contoh mudah yang mencetak mesej ke konsol selepas tamat masa 2 saat (2000 milisaat): setTimeout
Untuk menunjukkan konsep ini dengan lebih terperinci, demonstrasi berikut memaparkan tetingkap pop timbul selepas mengklik butang dua saat: (Sila lawati Codepen untuk melihat demo)
<code class="language-javascript">function greet() { console.log('Howdy!'); } setTimeout(greet, 2000);</code>Tatabahasa
Menurut dokumentasi MDN, sintaks
adalah seperti berikut:
setTimeout
of:
<code class="language-javascript">const timeoutID = setTimeout(code); const timeoutID = setTimeout(code, delay); const timeoutID = setTimeout(functionRef); const timeoutID = setTimeout(functionRef, delay); const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])</code>
adalah ID digital yang boleh digunakan bersempena dengan
timeoutID
clearTimeout
merujuk kepada antara muka scope
Window
WorkerGlobalScope
adalah fungsi yang akan dilaksanakan selepas pemasa tamat. functionRef
adalah sintaks alternatif yang membolehkan anda memasukkan rentetan dan bukannya fungsi yang disusun dan dilaksanakan apabila pemasa tamat. code
adalah bilangan milisaat yang panggilan fungsi harus ditangguhkan. Jika ditinggalkan, lalai adalah 0. delay
, ..., arg1
argN
functionRef
[]
dan
anda akan melihat bahawa kadang -kadang sintaks mengandungi window.setTimeout
. Mengapa ini?
Apabila menjalankan kod dalam penyemak imbas, scope
akan merujuk kepada objek Global window
. setTimeout
dan window.setTimeout
merujuk kepada fungsi yang sama, satu -satunya perbezaan ialah dalam pernyataan kedua, kita merujuk kepada kaedah setTimeout
sebagai harta objek window
.
Pada pendapat saya, ini menambah kerumitan, sementara manfaatnya adalah minimum. Jika anda menentukan kaedah setTimeout
yang lain yang akan ditemui terlebih dahulu dan kembali dalam rantaian skop, maka anda mungkin mempunyai masalah yang lebih besar untuk dibimbangkan.
Dalam tutorial ini, saya akan menghilangkan window
, tetapi pada akhirnya, terpulang kepada anda yang sintaks yang anda pilih.
Kaedah ini menerima rujukan fungsi sebagai parameter pertama. setTimeout
setTimeout
<code class="language-javascript">function greet() { console.log('Howdy!'); } setTimeout(greet, 2000);</code>atau fungsi tanpa nama:
<code class="language-javascript">const timeoutID = setTimeout(code); const timeoutID = setTimeout(code, delay); const timeoutID = setTimeout(functionRef); const timeoutID = setTimeout(functionRef, delay); const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])</code>Seperti yang disebutkan di atas, anda juga boleh lulus rentetan kod ke
untuk pelaksanaannya:
<code class="language-javascript">function greet() { alert('Howdy!'); } setTimeout(greet, 2000);</code>
setTimeout
<code class="language-javascript">const greet = function() { alert('Howdy!'); }; setTimeout(greet, 2000);</code>
Ia menggunakan tersirat
, yang merupakan risiko keselamatan yang berpotensi.eval
Parameter lulus ke
setTimeout
Dalam contoh berikut, kami memilih haiwan rawak dari array
. Kemudian, setTimeout
melaksanakan fungsi
animals
makeTalk
setTimeout
NOTA: Saya menggunakan fungsi biasa (makeTalk
) untuk mengembalikan elemen rawak dari array. Anda juga boleh menulisnya sebagai ekspresi fungsi menggunakan fungsi anak panah:
<code class="language-javascript">setTimeout(() => { alert('Howdy!'); }, 2000);</code>
kami akan memperkenalkan fungsi anak panah di bahagian seterusnya. Berikut adalah codepen yang mengandungi kod di atas (anda perlu membuka konsol untuk melihat output). getRandom
kaedah alternatif
<code class="language-javascript">setTimeout('alert("Howdy!");', 2000);</code>Dari sintaks di bahagian atas artikel, dapat dilihat bahawa terdapat kaedah kedua untuk lulus parameter ke fungsi panggil balik yang dilaksanakan oleh
. Ini melibatkan penyenaraian mana -mana parameter selepas kelewatan.
Rujuk kepada contoh sebelumnya, ini akan memberi kita:
setTimeout
Malangnya, ini tidak berfungsi di IE9 atau di bawah, di mana parameter diluluskan sebagai
<code class="language-javascript">function makeTalk(animal) { const noises = { cat: 'purr', dog: 'woof', cow: 'moo', pig: 'oink', } console.log(`A ${animal} goes ${noises[animal]}.`); } function getRandom(arr) { return arr[Math.floor(Math.random() * arr.length)]; } const animals = ['cat', 'dog', 'cow', 'pig']; const randomAnimal = getRandom(animals); setTimeout(() => { makeTalk(randomAnimal); }, 1000);</code>Soalan Kata Kata Kunci
setTimeout
Kod yang dilaksanakan berjalan dalam konteks pelaksanaan yang berbeza daripada fungsi yang memanggilnya. Ini menjadi masalah apabila konteks kata kunci this
adalah penting:
<code class="language-javascript">function greet() { console.log('Howdy!'); } setTimeout(greet, 2000);</code>Sebab output ini ialah dalam contoh pertama,
menunjuk ke objek this
, dan dalam contoh kedua, dog
menunjuk kepada objek this
global (ia tidak mempunyai atribut window
). sound
Penetapan penjelasan nilai
this
untuk membuat fungsi baru, dan apabila dipanggil, kata kunci bind
akan ditetapkan ke nilai yang disediakan (dalam hal ini objek bind
). Ini akan memberi kita: this
dog
Perpustakaan Pengguna
<code class="language-javascript">const timeoutID = setTimeout(code); const timeoutID = setTimeout(code, delay); const timeoutID = setTimeout(functionRef); const timeoutID = setTimeout(functionRef, delay); const timeoutID = setTimeout(functionRef, delay[, arg1, arg2, /* … ,*/ argN])</code>Banyak perpustakaan datang dengan fungsi terbina dalam untuk menyelesaikan masalah ini. Sebagai contoh, kaedah
jQuery. Ia menerima fungsi dan mengembalikan fungsi baru yang akan sentiasa mempunyai konteks tertentu. Dalam kes ini, itu akan menjadi:
jQuery.proxy()
Gunakan fungsi anak panah dalam
<code class="language-javascript">function greet() { alert('Howdy!'); } setTimeout(greet, 2000);</code>Fungsi anak panah diperkenalkan dalam ES6. Mereka jauh lebih pendek daripada sintaks fungsi biasa:
setTimeout
, tetapi satu perkara yang perlu diperhatikan - fungsi anak panah tidak mempunyai nilai
sendiri. Sebaliknya, mereka menggunakan nilai<code class="language-javascript">const greet = function() { alert('Howdy!'); }; setTimeout(greet, 2000);</code>konteks leksikal yang tertutup.
setTimeout
Gunakan fungsi biasa: this
this
<code class="language-javascript">setTimeout(() => { alert('Howdy!'); }, 2000);</code>Dalam contoh kedua,
menunjuk kepada objek
global (sekali lagi, ia tidak mempunyai harta<code class="language-javascript">setTimeout('alert("Howdy!");', 2000);</code>
Ini boleh membawa kita ke dalam masalah apabila menggunakan fungsi anak panah dengan this
. Kami telah melihat sebelum ini untuk memberikan nilai window
yang betul untuk fungsi yang dipanggil dalam sound
:
setTimeout
Ini tidak akan berfungsi apabila menggunakan fungsi anak panah dalam kaedah yang diperkenalkan, kerana fungsi anak panah tidak mempunyai nilai setTimeout
sendiri. Kaedah ini masih akan merakam this
.
<code class="language-javascript">function makeTalk(animal) { const noises = { cat: 'purr', dog: 'woof', cow: 'moo', pig: 'oink', } console.log(`A ${animal} goes ${noises[animal]}.`); } function getRandom(arr) { return arr[Math.floor(Math.random() * arr.length)]; } const animals = ['cat', 'dog', 'cow', 'pig']; const randomAnimal = getRandom(animals); setTimeout(() => { makeTalk(randomAnimal); }, 1000);</code>Menulis kod bersih menggunakan fungsi anak panah dan
this
sendiri, ia juga boleh memberi kita kelebihan. undefined
setTimeout
this
Batalkan pemasa
<code class="language-javascript">const getRandom = arr => arr[Math.floor(Math.random() * arr.length)];</code>
Seperti yang kita pelajari pada permulaan artikel, nilai pulangan
adalah ID angka yang boleh digunakan bersamaan dengan fungsi<code class="language-javascript">setTimeout(makeTalk, 1000, randomAnimal);</code>untuk membatalkan pemasa:
<code class="language-javascript">function greet() { console.log('Howdy!'); } setTimeout(greet, 2000);</code>
mari kita lihat bagaimana ia berfungsi. Dalam pen di bawah, jika anda mengklik butang Countdown Mula, undur akan bermula. Sekiranya undur selesai, anak kucing menang. Walau bagaimanapun, jika anda menekan butang "Hentikan Countdown", pemasa akan dihentikan dan ditetapkan semula. (Jika anda tidak melihat kesan sejuk apabila undur mencapai sifar, penun pena menggunakan butang yang tertanam di sebelah kanan bawah.)
Ringkasan
Dalam artikel ini, saya menunjukkan cara menggunakan setTimeout
untuk melambatkan pelaksanaan fungsi. Saya juga menunjukkan cara lulus parameter ke setTimeout
, bagaimana untuk mengekalkan nilai this
di dalam fungsi panggil baliknya, dan bagaimana membatalkan pemasa.
setTimeout
FAQS untuk fungsi JavaScript
Apa yang ada di JavaScript?
setTimeout
adalah fungsi terbina dalam dalam JavaScript yang membolehkan anda menjadualkan pelaksanaan fungsi atau segmen kod selepas kelewatan tertentu (dalam milisaat). setTimeout
Bagaimana ia berfungsi? setTimeout
Apabila anda memanggil fungsi
setTimeout
? setTimeout
Ya, terdapat alternatif, seperti
, yang merupakan animasi yang lebih lancar dan prestasi penyemak imbas yang lebih baik. setInterval
requestAnimationFrame
? setTimeout
. Anda tidak boleh bersarang pelbagai setTimeout
panggilan; requestAnimationFrame
tidak tepat untuk kelewatan kurang daripada 10 milisaat; Jika anda membina aplikasi masa nyata (seperti permainan multiplayer dalam talian atau platform perdagangan kewangan), pilih teknologi masa nyata seperti WebSockets. Tugas-tugas yang berintensifkan CPU boleh menghalang gelung acara; setTimeout
setTimeout
? setTimeout
Ya, anda boleh menggunakan fungsi
sebagai parameter. Contohnya: clearTimeout
setTimeout
const timeoutId = setTimeout(myFunction, 1000); clearTimeout(timeoutId);
dan ? setTimeout
setInterval
setTimeout
Jadualkan fungsi untuk dijalankan sekali selepas kelewatan yang ditentukan, manakala setInterval
menjadualkan fungsi untuk berjalan berulang kali pada selang yang ditentukan sehingga dibatalkan atau program berhenti.
Apakah nilai kelewatan minimum yang boleh saya gunakan setTimeout
?
Nilai kelewatan minimum adalah 0, yang bermaksud bahawa fungsi itu dijadualkan dilaksanakan sebelum thread semasa selesai tetapi mengendalikan sebarang peristiwa yang belum selesai. Walau bagaimanapun, granulariti sebenar pemasa berbeza dari penyemak imbas ke penyemak imbas dan persekitaran kepada pelayar yang berbeza. Sesetengah persekitaran mungkin tidak menyokong kelewatan kurang daripada 10 milisaat.
Apa yang ada di node.js?
setTimeout
adalah fungsi terbina dalam untuk node.js yang menangguhkan pelaksanaan fungsi atau blok kod yang diberikan oleh bilangan milisaat tertentu. setTimeout
bagaimana menggunakan dalam node.js? setTimeout
seperti berikut: setTimeout
di mana setTimeout(callback, delay);
adalah fungsi yang anda ingin laksanakan selepas kelewatan milisaat yang ditentukan. callback
Apakah amalan terbaik untuk menggunakan dalam node.js? setTimeout
untuk melaksanakan dengan segera semasa kitaran gelung acara seterusnya. setImmediate
Atas ialah kandungan terperinci Fungsi JavaScript SetTimeout: Panduan dengan contoh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!