Kod berikut, saya fikir ia akan mengeluarkan 1-10, tetapi outputnya ialah 5, dan ia terus mengeluarkan 5. Ia adalah gelung tak terhingga Saya tidak faham. Terima kasih!
function initloop() {
function doLoop(x) {
i = 3;
console.log(x);
}
for (var i = 0; i < 10; i++) {
doLoop(i + 1);
}
}
initloop();
Bahawa i sebenarnya sama dengan diisytiharkan dalam initloop.
Lihat dengan cara ini, jika anda berfikir tentang proses pelaksanaan fungsi, anda harus faham
Setiap kali ia gelung, saya akan diubah suai kepada 3 dalam doloop
Selepas doloop dilaksanakan, i++ dilaksanakan, dan parameter sebenar lulus. ke dalam gelung haruslah Ia 4 + 1;
Jadi konsol pertama ialah 1, dan kemudian ia terus mengeluarkan 5 dalam gelung tak terhingga.
Jika anda ingin mengeluarkan 1 - 10 seperti yang anda mahu, tambahkan var kepada i dalam doloop. Jadikan ia pembolehubah setempat.
Gelung pertama i=0, parameter sebenar doloop i+1 ialah 1, jadi output pertama ialah 1. Oleh kerana tiada pembolehubah i dalam fungsi doloop, ia akan mencari pembolehubah i dalam skop luaran, jadi i=3 akan menetapkan nilai i dalam badan gelung kepada 3. Selepas gelung pertama tamat, kerana i<10, i++ ialah 4. Bermula dari kali kedua, i ialah 4, jadi parameter sebenar dooloop ialah 5. Kerana i diberikan nilai 3 setiap kali fungsi dloop dilaksanakan, jadi i sentiasa kurang daripada 10. Hasilnya ialah 1 buat kali pertama, dan kemudian mencetak 5 dalam satu gelung.
Mula-mula saya cuba menjalankan kod anda, dan penyemak imbas tersekat dua kali... Saya meratapi penyemak imbas saya...
Atas sebab ini, saya dapati kod anda beracun...
Apabila sebenarnya berjalan, input adalah seperti berikut:
Kali pertama dalam gelung for,1 .
i===0
, melaksanakandoLoop(1)
, jadi di dalam fungsidoLoop
, parameter formalx===1, kemudian nilai luaran i ditukar dan ditetapkan semula kepada3
, jadi pada masa inii===3
, diikuti dengan Nilai x dicetak, iaitui===0
, 执行doLoop(1)
, 因此doLoop
函数内部, 形参x===1
, 接着又改变了外部i的值, 重置为3
, 故此时i===3
, 紧接着打印出了x的值, 即1
.for循环第二次时, 由于第一次循环结束时
i===3
, 发生自增操作, 即i++
. 故i最终等于4
.4+1=5
, 故执行doLoop(5)
,本次打印出了5
. 函数内部重复上一次的操作, 外部i变量再次被重置为3
,本次循环结束后i===5
.for循环第三次时, 重复上次操作, i再次被重置为
3
, 再次打印5
, 以此类推, 最终外层的for循环失效, 每次i的值都被重置为3
i===3
, operasi kenaikan berlaku, iaitu,i++
. Oleh itu, i akhirnya sama dengan4
4+1=5
, jadidoLoop(5)
dilaksanakan dan5<.> dicetak kali ini Di dalam fungsi Ulangi operasi terakhir, pembolehubah i luaran ditetapkan semula kepada
3
sekali lagi, dan selepas tamat kitaran ini,i===5<.>. 🎜🎜Untuk kali ketiga dalam gelung for, operasi terakhir diulang, i ditetapkan semula kepada3 setiap kali, dan syarat penghujung gelung tidak dapat dipenuhi Oleh itu, penyemak imbas menjadi beku.🎜🎜
🎜
🎜Untuk meringkaskan, cara penulisan ini bermasalah. Cuba untuk tidak menukar pembolehubah di luar fungsi di dalam fungsi.🎜
3
sekali lagi,5
dicetak semula, dan seterusnya, bahagian luar terakhir untuk gelung Tidak sah, nilai i ditetapkan semula kepadaSetiap kali dalam gelung, i diberikan nilai 3, dan i dalam fungsi dloop bukan pembolehubah persendirian, jadi setiap kali i dalam initloop diberikan nilai 3, kali seterusnya i++ digelung, i menjadi 4 dan dihantar ke dalam dloop Sememangnya, setiap nilai yang dicetak ialah 5. Selepas menyelesaikannya, dloop menukar i kepada 3. i tidak akan sama dengan 10, jadi gelung tidak berkesudahan