Rumah > hujung hadapan web > tutorial js > Perbincangan ringkas tentang penutupan dalam kemahiran javascript_javascript

Perbincangan ringkas tentang penutupan dalam kemahiran javascript_javascript

WBOY
Lepaskan: 2016-05-16 15:59:25
asal
1134 orang telah melayarinya

Saya tidak memahami penutupan untuk masa yang lama Kemudian, saya belajar tentang skop dan isu berkaitan ini sebelum saya memahami pengetahuan berkaitan penutupan.
Penutup juga merupakan soalan wawancara biasa. Ringkasnya, ia adalah fungsi bersarang fungsi.

Berfungsi sebagai nilai pulangan:

function foo () {
  var a = 1;
  return function () {
   a++;
   console.log(a);
  }
}
var aaa = foo();
aaa(); //2
aaa(); //3
Salin selepas log masuk

Sebenarnya, kod ini tidak sukar difahami aaa menunjuk ke fungsi baharu yang dikembalikan oleh foo(), tetapi pembolehubah dirujuk dalam fungsi ini, jadi apabila fungsi foo dilaksanakan, pembolehubah a masih wujud dalam. ingatan dan tidak dilepaskan. Iaitu, a ialah 2 dan 3 masing-masing.

Fungsi sebagai parameter:

var a = 10;
function foo () {
console.log(a);
}
function aaa(fn) {
 var a = 100;
 fn();
}
aaa(foo);
Salin selepas log masuk

Mengikut pemahaman saya sebelum ini, apabila fungsi fn dilaksanakan dalam fungsi aaa, maka jika ia tidak mempunyai pembolehubah, pergi ke skop induk untuk mencari pembolehubah Ini adalah 100. Adakah hasilnya 100?

Malangnya, jawapannya adalah tidak. Hasilnya di sini ialah 10. Blog Cikgu Wang Fupeng menerangkannya dengan lebih baik.

Senario penggunaan penutupan

Oleh kerana saya masih baru, saya akan mengambil contoh mudah di sini. Apabila li diklik, kedudukan li dalam ul, iaitu nilai indeks, muncul.

kod html:

<ul>
  <li>001</li>
  <li>002</li>
  <li>003</li>
</ul>
Salin selepas log masuk

kod js:

Contoh 1:
Sila lihat kod di bawah Selepas menjalankannya, anda mendapati bahawa tidak kira li yang diklik, hasilnya adalah 3.

var aLi = document.getElementsByTagName('li');
for (var i = 0; i<aLi.length; i++) {
  aLi[i].onclick = function() {
   alert(i);
  }
}
Salin selepas log masuk

Oleh kerana tiada pembolehubah i dalam fungsi tanpa nama, apabila untuk tamat, kami klik pada tag li halaman Pada masa ini, i sudah 3.

Contoh 2:

aLi[i].onclick = (function(i){
    return function(){
      alert(i);
    }
  })(i);
Salin selepas log masuk

Kali ini, kaedahnya adalah menggunakan fungsi sebagai nilai pulangan, dan lulus pembolehubah i melalui parameter fungsi laksana sendiri Kemudian, kerana fungsi pulangan merujuk kepada pembolehubah i, pembolehubah i tidak dilepaskan apabila gelung for tamat. Iaitu, nilai pembolehubah i disimpan dalam ingatan. Berdasarkan prinsip ini, mudah untuk menyebabkan kebocoran memori dalam versi IE yang lebih rendah.

Contoh 3:

for (var i = 0; i<aLi.length; i++) {
  (function(i){
    aLi[i].onclick = function(){
      alert(i);
    }
  })(i);
}
Salin selepas log masuk

Prinsip ini serupa dengan yang di atas.

Soalan temu duga penutup hadapan Xiaomi:

function repeat (func, times, wait) {
} //这个函数能返回一个新函数,比如这样用

var repeatedFun = repeat(alert, 10, 5000)
//调用这个 repeatedFun ("hellworld")

//会alert十次 helloworld, 每次间隔5秒

Salin selepas log masuk

Jawapan saya:

function repeat (func, times, wait) {
  return function(str) {
    while (times >0) {
      setTimeout(function(){
        func(str);
      },wait);
      times--;
    }
  }
}

var repeatedFun = repeat(alert, 10, 100);
repeatedFun ("hellworld");
Salin selepas log masuk

Di atas adalah keseluruhan kandungan artikel ini, saya harap ia akan membantu semua orang yang mempelajari penutupan javascript.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan