Cara untuk menghantar parameter ke setTimeout dan setInterval
Lihat kod berikut:
var str = 'aaa'; var num = 2; function auto(num){ alert(num); } setTimeout('auto(num)',4000);
Menulis seperti ini boleh berfungsi seperti biasa, tetapi daripada mengatakan bahawa ini adalah lulus parameter, lebih baik untuk mengatakan bahawa ia adalah pembolehubah global yang digunakan secara langsung. Oleh itu, cara penulisan ini tidak perlu Secara umum, pembolehubah tempatan diluluskan sebagai parameter.
Ubah suai kod:
//var str = 'aaa'; var num = 2; function test(){ var str = 'bbb'; setTimeout('auto(str)',4000); } function auto(a){ alert(a); } test();
Cara penulisan ini akan melaporkan ralat Jika anda membatalkan ulasan pengisytiharan global str, aaa akan menjadi output, iaitu, fungsi masih memanggil pembolehubah global.
Lihat kod di bawah:
//var str = 'aaa'; var num = 2; function test(){ var str = 'bbb'; setTimeout('auto("str")',4000); } function auto(a){ alert(a); } test();
Perhatikan str di atas dengan cara ini akan mengeluarkan "str", yang bermaksud bahawa selepas pemasa memanggil fungsi, str digunakan secara langsung sebagai parameter. Parameter yang dilalui dengan cara ini sentiasa rentetan. Ini bukan hasil yang kita mahukan.
Untuk menghantar parameter selain daripada rentetan, anda boleh menggunakan penutupan, lihat kod berikut:
//var str = 'aaa'; var num = 2; function test(){ var str = 'bbb'; setTimeout(auto(str),4000); } function auto(str){ return function(){ alert(str); } } test();
Hasil output ialah 'bbb' Jika anda menambah petikan pada auto(str), ralat juga akan dilaporkan.
Sudah tentu, ia juga bagus untuk menulis seperti ini:
var num = 2; function test(){ var str = 'bbb'; //setTimeout(auto(str),4000); setTimeout(function(){alert(str)},4000); } function auto(str){ return function(){ alert(str); } } test();
Perkara terakhir yang perlu diambil perhatian ialah apabila anda tidak menggunakan penutupan untuk menghantar parameter, fungsi yang dipanggil oleh pemasa perlu disebut Jika anda tidak menambah petikan, ralat akan dilaporkan. Situasi di atas juga sesuai untuk setInterval();
Panggilan fungsi dalam setTimeout dan setInterval
mempunyai kod berikut:
var num = 2; function auto(){ alert(num); } setTimeout(auto(),4000);
Begitu juga, kaedah penulisan di atas untuk setInterval tidak berfungsi dengan betul Program ini hanya boleh memaparkan kotak amaran sekali dan kemudian melaporkan ralat.
Tukar pemasa kepada
setInterval('auto()',4000); setTimeout('auto()',4000);
Apakah rupanya jika anda tidak menggunakan auto() untuk memanggil fungsi tetapi hanya menggunakan auto?
var str = 'aaa'; var num = 2; function auto(){ alert(num); } //setInterval(auto,4000); setTimeout(auto,4000);
Jika anda menambah petikan pada auto
//setInterval('auto',4000); setTimeout('auto',4000);