Rumah > Soal Jawab > teks badan
for(var i=1;i<5;i++){
setTimeout(function(){console.log(i)},i*1000);
}
Di sini gelung for dilengkapkan dahulu
dan kemudian i The nilai telah menjadi 5
Kemudian gelung for dilaksanakan dahulu, jadi mengapa i*1000 dilaksanakan?
滿天的星座2017-05-18 11:02:35
Apabila gelung for dilaksanakan, ia bersamaan dengan menulis 4 fungsi pemasa pada halaman Pada masa ini, fungsi pemasa masih belum dilaksanakan, dan nilai pembolehubah i dalam global ialah 5 apabila masa pemasa sudah habis, fungsi pemasa dilaksanakan mengikut urutan.
Contoh ini bukan penutupan perlu ditulis seperti ini, yang bersamaan dengan menulis empat fungsi yang dilaksanakan dengan serta-merta pada halaman Parameter sebenar yang diterima oleh empat fungsi ini adalah 1, 2, 3, dan 4 dalam urutan. Mengikut ciri penutupan: Apabila pemasa tamat, fungsi pemasa boleh mengakses parameter sebenar yang diterima oleh fungsi luarnya, jadi ia akan mencetak 1, 2, 3, 4 dalam urutan
for(var i=1;i<5;i++){
(function(i){
setTimeout(function(){console.log(i)},i*1000);
})(i)
}
给我你的怀抱2017-05-18 11:02:35
Dalam komputer, mana-mana pembolehubah mesti membuka ruang dalam memori untuk disimpan, dan kemudian semuanya mempunyai alamat. Jika anda telah mempelajari bahasa C atau bahasa himpunan, anda harus mengetahui perkara ini dengan lebih baik.
Mari kita bincangkan dahulu mengapa saya mengeluarkan 5 setiap kali. Kerana ruang i (iaitu, ruang ingatan yang digunakan untuk menyimpan i, secara saintifik dipanggil "tindanan") telah diubah suai lima kali, dan apabila fungsi tanpa nama dilaksanakan, ruang i menyimpan 5.
Mari terangkan mengapa parameter kedua berbeza setiap kali. i*1000
并没有修改i
的值,而是会产生一个结果。那么这个结果必然要找地方去存。存储在哪呢?setTimeout
每被调用一次,都会开辟一段内存空间,其中一部分空间就用于存储它的两个参数。其中一个参数就是刚才i*1000
产生的结果。而setTimeout
被调用了5次,于是存储了5个结果!没错,是在5个不同的空间存储了5个结果,而不是像i
Ruang yang sama telah diubah suai sebanyak 5 kali! Seperti yang anda boleh bayangkan, pendekatan ini sangat intensif memori.
Bolehkah anda memahami penjelasan ini?
phpcn_u15822017-05-18 11:02:35
Apabila fungsi for memasuki utas utama, setiap setTimeout memasuki baris gilir tugasan untuk menunggu secara bergilir-gilir Selepas for dilaksanakan, setTimeout dalam baris gilir tugasan memasuki utas utama untuk pelaksanaan. Tanpa penutupan, i sudah 5 apabila setTimeout dilaksanakan dengan penutupan, nilai i akan disimpan apabila setTimeout memasuki baris gilir tugas.
Lihat: gelung acara