Baru-baru ini saya sedang membaca Pengenalan Guru Ruan Yifeng kepada Standard ES, dan apabila saya membaca bab pertama, saya menyebut sekeping kod
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
Menggunakan let here boleh menyelesaikan masalah ini, tetapi bagaimana jika kita menggunakan kaedah ES5? IIFE boleh melakukannya, tetapi ia mencetaknya serta-merta.
Masalah penutupan
Anda boleh menggunakan atribut tersuai
var a = [];
untuk (var i = 0; i < 10; i++) {
}
a[6](); // 6
Ini tiada kena mengena dengan apa-apa saya rasa penyoal nak keluarkan 6 kan?
Tapi soalan yang awak tanya tu macam tak relevan langsung dengan apa yang awak nak saya nak tolong awak tukar huraian soalan tapi saya agak tak berdaya...let
ialah 10, jadi 10 ialah output.
Mengenai apa yang dikatakan oleh penyoal,for
里面的i
的作用于是整个外部区域,所以,当调用a[6]()
的时候,其实运行的是console.log(i)
,而此时因为跑完循环,i
boleh diselesaikan kerana pembolehubah yang diisytiharkan oleh
let
可以解决,是因为,for
里面,let
声明的变量,作用于只在for
内部,所以,不会因为循环跑完而使得i
dalamfor
hanya berfungsi di dalamfor
, jadi ia tidak akan dijalankan kerana gelungi
bersamaan dengan 10 dalam skop global.Malah, perkara yang benar-benar diteliti soalan ini adalah penutup.
Peranan penutupan adalah serupa dengan peranan
let
sebelumnya, iaitu mengasingkan pembolehubah tempatan antara satu sama lain tanpa mencemarkan nilai pembolehubah luaran Setiap penutupan adalah kawasan bebas, dan parameter penutupan hanya menggunakan Ia digunakan di dalam penutupan, jadi hasil keluaran 6 juga boleh dicapai.Anda boleh menggunakan penutupan
http://www.softwhy.com/articl...
Separuh kedua artikel ini telah menjelaskan soalan anda