Rumah  >  Artikel  >  hujung hadapan web  >  Nota Kajian Javascript - Fungsi (3): Penutup dan Rujukan_Pengetahuan Asas

Nota Kajian Javascript - Fungsi (3): Penutup dan Rujukan_Pengetahuan Asas

WBOY
WBOYasal
2016-05-16 16:30:361333semak imbas

Salah satu ciri terpenting dalam Javascript ialah penggunaan penutupan. Oleh kerana penggunaan penutupan, skop semasa sentiasa boleh mengakses skop luaran. Oleh kerana Javascript tidak mempunyai skop peringkat blok, hanya skop fungsi, penggunaan penutupan berkait rapat dengan fungsi.

Pembolehubah persendirian olok-olok

Salin kod Kod adalah seperti berikut:

fungsi Pembilang(mula) {
kiraan var = mula;
Kembali {
kenaikan: function() {
Kira ;
},
          dapatkan: function() {
              kiraan pulangan;
}
}
}
var foo = Kaunter(4);
foo.increment();
foo.get(); // 5

Di sini Kaunter mengembalikan dua penutupan: fungsi kenaikan dan perolehan. Kedua-dua fungsi ini mengekalkan akses kepada skop Kaunter, supaya mereka sentiasa boleh mengakses kiraan pembolehubah yang ditakrifkan dalam skop Kaunter.

Cara pembolehubah persendirian berfungsi

Memandangkan Javascript tidak boleh menetapkan atau merujuk skop, dalam contoh di atas, tiada cara untuk mengakses terus kiraan pembolehubah peribadi dalaman dari luar. Satu-satunya cara untuk mengaksesnya ialah dengan menentukan penutupan.

Salin kod Kod adalah seperti berikut:

var foo = Kaunter baharu(4);
foo.hack = function() {
Kiraan = 1337;
};

Kod di atas tidak akan mengubah nilai pembolehubah kiraan dalam skop Kaunter kerana penggodaman tidak ditakrifkan dalam Kaunter. Kod di atas hanya akan membuat atau menulis ganti kiraan pembolehubah global.

Penutupan dalam satu gelung

Salah satu kesilapan yang paling biasa ialah menggunakan penutupan di dalam gelung.

Salin kod Kod adalah seperti berikut:

untuk(var i = 0; i < 10; i ) {
setTimeout(function() {
console.log(i);
}, 1000);
}

Kod di atas tidak akan mengeluarkan 0 hingga 9, tetapi akan mengeluarkan 10 kali secara berterusan.
Ketidaknamaan di atas akan sentiasa mengekalkan rujukan kepada pembolehubah i. Apabila fungsi console.log dipanggil untuk memulakan output, gelung telah tamat dan pembolehubah i sudah 10.
Untuk mengelakkan ralat di atas, kita perlu mencipta salinan pembolehubah nilai i setiap kali melalui gelung.

Elakkan ralat petikan

Untuk menyalin nilai pembolehubah dalam gelung, cara terbaik ialah menambah fungsi pelaksanaan segera tanpa nama di lapisan luar.

Salin kod Kod adalah seperti berikut:

untuk(var i = 0; i < 10; i ) {
(fungsi(e) {
​​ setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

Fungsi tanpa nama luar ini menerima pembolehubah gelung i sebagai parameter pertama dan menyalin nilainya ke parameternya sendiri e.
Fungsi tanpa nama luaran menghantar parameter e kepada setTimeout, jadi setTimeout mempunyai rujukan kepada parameter e. Dan nilai parameter e ini tidak akan berubah kerana perubahan gelung luaran.

Terdapat cara lain untuk mencapai kesan yang sama, iaitu mengembalikan fungsi tanpa nama dalam fungsi tanpa nama dalam setTimeout:

Salin kod Kod adalah seperti berikut:

untuk(var i = 0; i < 10; i ) {
setTimeout((fungsi(e) {
         kembali fungsi() {
console.log(e);
}
})(i), 1000)
}

Selain itu, ini juga boleh dicapai melalui kaedah bind.

Salin kod Kod adalah seperti berikut:

untuk(var i = 0; i < 10; i ) {
setTimeout(console.log.bind(console, i), 1000);
}

Pada akhir artikel, mari kita ringkaskan:

(1) Penutupan ialah prinsip reka bentuk yang memudahkan panggilan pengguna dengan menganalisis konteks, membolehkan pengguna mencapai tujuannya tanpa mengetahui
(2) Artikel arus perdana mengenai analisis penutupan di Internet sebenarnya bertentangan dengan prinsip penutupan Jika anda perlu mengetahui butiran penutupan untuk menggunakannya dengan baik, penutupan adalah kegagalan reka bentuk (3) Belajar sesedikit mungkin.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn