Rumah > Soal Jawab > teks badan
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.
扔个三星炸死你2017-06-28 09:24:57
var a = [];
for(var i = 0; i < 10; i++) {
+function(i){
a[i] = function() {
console.log(i);
}
}(i);
};
a[6](); // 6
Masalah penutupan
巴扎黑2017-06-28 09:24:57
Anda boleh menggunakan atribut tersuai
var a = [];
untuk (var i = 0; i < 10; i++) {
var a[i].n = i;//自定义一个属性 n
a[i] = function () {
console.log(this.n);
};
}
a[6](); // 6
曾经蜡笔没有小新2017-06-28 09:24:57
Ini tiada kena mengena dengan apa-apa saya rasa penyoal nak keluarkan 6 kan? let
Ini sebenarnya masalah penutupan Terutamanya, mari kita analisis dahulu mengapa 10 adalah output:
var a = [];
for(var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
Nilai ialah 10, jadi 10 ialah output. for
里面的i
的作用于是整个外部区域,所以,当调用a[6]()
的时候,其实运行的是console.log(i)
,而此时因为跑完循环,i
boleh diselesaikan kerana pembolehubah yang diisytiharkan oleh let
可以解决,是因为,for
里面,let
声明的变量,作用于只在for
内部,所以,不会因为循环跑完而使得i
dalam for
hanya berfungsi di dalam for
, jadi ia tidak akan dijalankan kerana gelung i
bersamaan dengan 10 dalam skop global.
Malah, perkara yang benar-benar diteliti soalan ini adalah penutup.
var a = [];
for(var i = 0; i < 10; i++) {
(function() {
[i] = function () {
console.log(i);
}
})(i);
}
a[6]();
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.
天蓬老师2017-06-28 09:24:57
Anda boleh menggunakan penutupan
http://www.softwhy.com/articl...
Separuh kedua artikel ini telah menjelaskan soalan anda