Sila analisis |. Mengapakah output kod JavaScript ini 5?
大家讲道理
大家讲道理 2017-05-19 10:40:19
0
4
534

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();
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(4)
阿神

Bahawa i sebenarnya sama dengan diisytiharkan dalam initloop.

function initloop() {
    var i = 0;
    function doLoop(x) {
        i = 3;
        console.log(x);
    }
    for ( ; i < 10; i++) {
        doLoop(i + 1);
    }
    
}

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:

  1. Kali pertama dalam gelung for, i===0, melaksanakan doLoop(1), jadi di dalam fungsi doLoop, parameter formalx===1, kemudian nilai luaran i ditukar dan ditetapkan semula kepada 3, jadi pada masa ini i===3, diikuti dengan Nilai x dicetak, iaitu 1.i===0, 执行doLoop(1), 因此doLoop函数内部, 形参x===1, 接着又改变了外部i的值, 重置为3, 故此时i===3, 紧接着打印出了x的值, 即1.

  2. for循环第二次时, 由于第一次循环结束时i===3, 发生自增操作, 即i++. 故i最终等于4. 4+1=5, 故执行doLoop(5),本次打印出了5. 函数内部重复上一次的操作, 外部i变量再次被重置为3,本次循环结束后i===5.

  3. for循环第三次时, 重复上次操作, i再次被重置为3, 再次打印5, 以此类推, 最终外层的for循环失效, 每次i的值都被重置为3

Apabila gelung for untuk kali kedua, kerana pada penghujung gelung pertama i===3, operasi kenaikan berlaku, iaitu, i++. Oleh itu, i akhirnya sama dengan 4 4+1=5, jadi doLoop(5) dilaksanakan dan 5<.> 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 kepada 3 sekali lagi, 5 dicetak semula, dan seterusnya, bahagian luar terakhir untuk gelung Tidak sah, nilai i ditetapkan semula kepada 3 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.🎜
洪涛

Setiap 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

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