Rumah >hujung hadapan web >tutorial js >Apakah perbezaan antara penutupan JavaScript dan fungsi tanpa nama?

Apakah perbezaan antara penutupan JavaScript dan fungsi tanpa nama?

Barbara Streisand
Barbara Streisandasal
2024-10-29 18:18:45787semak imbas

What's the difference between JavaScript closures and anonymous functions?

Penutupan JavaScript dan Fungsi Tanpa Nama

Penutupan ialah konsep penting dalam JavaScript, membolehkan fungsi mengakses pembolehubah daripada skop tertutupnya, walaupun selepas fungsi dipanggil. Walau bagaimanapun, adalah penting untuk membezakan antara penutupan dan fungsi tanpa nama.

Pertimbangkan contoh biasa: menggunakan gelung dan setTimeout untuk melambatkan pengelogan pembolehubah balas. Tanpa menggunakan penutupan, kod akan mencetak nilai akhir beberapa kali.

Penggunaan Penutupan yang Salah:

for (var i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i); // This incorrectly prints 10 for each iteration
  }, 1000);
}

Masalahnya di sini ialah fungsi tanpa nama tidak tangkap nilai i untuk setiap lelaran. Sebaliknya, ia menangkap rujukan kepada i dalam skop global, yang akhirnya mencapai nilai akhir 10.

Penggunaan Penutupan Betul:

for (var i = 0; i < 10; i++) {
  (function() {
    var i2 = i;
    setTimeout(function() {
      console.log(i2); // This correctly prints 0 to 9 with delay
    }, 1000);
  })();
}

Dalam kes ini , fungsi tanpa nama mencipta pembolehubah baharu i2, yang dimulakan dengan nilai semasa i. Fungsi tanpa nama dalaman kemudiannya menangkap nilai i2 dan menggunakannya untuk pengelogan, dengan itu mengekalkan nilai daripada lelaran asal.

Membezakan Antara Penutupan dan Fungsi Tanpa Nama:

Walaupun semua fungsi dalam JavaScript secara teknikal "menutup" pembolehubahnya, istilah "penutupan" biasanya dikhaskan untuk fungsi yang:

  • Mempunyai akses kepada pembolehubah dari skop luar (iaitu, bukan tempatan atau " pembolehubah bebas")
  • Dirujuk dari luar skop yang ditakrifkan dalam (iaitu, "tertutup" di sekeliling pembolehubah bebasnya)

Dalam contoh pertama, fungsi tanpa nama ' t memenuhi kriteria ini kerana ia tidak menangkap pembolehubah i. Dalam contoh kedua, fungsi tanpa nama memenuhi syarat ini dan oleh itu dianggap sebagai penutupan.

Kesimpulan:

Memahami perbezaan antara penutupan dan fungsi tanpa nama adalah penting untuk menggunakan kuasa JavaScript dengan berkesan. Penutupan membenarkan fungsi berinteraksi dengan skop lampirannya, menyediakan enkapsulasi dan membolehkan akses tertunda kepada pembolehubah, yang amat bermanfaat untuk operasi tak segerak dan pengendalian acara.

Atas ialah kandungan terperinci Apakah perbezaan antara penutupan JavaScript dan fungsi tanpa nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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