javascript - untuk gelung dan penutupan
为情所困
为情所困 2017-05-18 11:00:35
0
3
637

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?

为情所困
为情所困

membalas semua(3)
滿天的星座

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)
    }
给我你的怀抱

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个结果,而不是像iRuang yang sama telah diubah suai sebanyak 5 kali! Seperti yang anda boleh bayangkan, pendekatan ini sangat intensif memori.

Bolehkah anda memahami penjelasan ini?

phpcn_u1582

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan