Rumah hujung hadapan web tutorial js Analisis mendalam tentang mekanisme penutupan JavaScript_Pengetahuan asas

Analisis mendalam tentang mekanisme penutupan JavaScript_Pengetahuan asas

May 16, 2016 pm 03:35 PM
javascript penutupan

Pembolehubah JavaScript boleh menjadi pembolehubah tempatan atau pembolehubah global.
Penutupan boleh digunakan untuk pembolehubah persendirian.
Pembolehubah global
Fungsi boleh mengakses pembolehubah yang ditakrifkan dalam fungsi, seperti:
Contoh

function myFunction() {
  var a = 4;
  return a * a;
}
Salin selepas log masuk


Fungsi juga boleh mengakses pembolehubah yang ditakrifkan di luar fungsi, seperti:
Contoh

var a = 4;
function myFunction() {
  return a * a;
}
Salin selepas log masuk

Dalam contoh terakhir, a ialah pembolehubah global.
Pembolehubah global dalam halaman web tergolong dalam objek tetingkap.
Pembolehubah global digunakan pada semua skrip pada halaman.
Dalam contoh pertama, a ialah pembolehubah tempatan.
Pembolehubah tempatan hanya boleh digunakan di dalam fungsi di mana ia ditakrifkan. Tidak tersedia untuk fungsi lain atau kod skrip.
Walaupun pembolehubah global dan tempatan mempunyai nama yang sama, ia adalah dua pembolehubah yang berbeza. Mengubah suai salah satu daripadanya tidak akan menjejaskan nilai yang lain.
Nota
Jika pembolehubah diisytiharkan tanpa kata kunci var, ia adalah pembolehubah global, walaupun ia ditakrifkan dalam fungsi.

Kitaran hayat boleh ubah
Skop pembolehubah global adalah global, iaitu pembolehubah global terdapat di mana-mana dalam keseluruhan program JavaScript.
Pembolehubah yang diisytiharkan di dalam fungsi hanya berfungsi di dalam fungsi. Pembolehubah ini adalah pembolehubah tempatan dan skopnya adalah setempat; parameter fungsi juga adalah setempat dan hanya berfungsi di dalam fungsi.
Dilema Kaunter
Bayangkan anda ingin mengira beberapa nilai, dan kaunter tersedia dalam semua fungsi.
Anda boleh menggunakan pembolehubah global, fungsi untuk menetapkan pembilang kepada kenaikan:
Contoh

var counter = 0;

function add() {
  counter += 1;
}

add();
add();
add();

// 计数器现在为 3

Salin selepas log masuk

Nilai pembilang berubah apabila fungsi add() dilaksanakan.
Tetapi inilah masalahnya, mana-mana skrip pada halaman boleh menukar kaunter, walaupun fungsi add() tidak dipanggil.
Jika saya mengisytiharkan pembilang di dalam fungsi, nilai pembilang tidak boleh diubah suai tanpa memanggil fungsi:
Contoh

function add() {
  var counter = 0;
  counter += 1;
}

add();
add();
add();

// 本意是想输出 3, 但事与愿违,输出的都是 1 !

Salin selepas log masuk

Kod di atas tidak akan dikeluarkan dengan betul, setiap kali saya memanggil fungsi add(), pembilang akan ditetapkan kepada 1.
Fungsi sebaris JavaScript boleh menyelesaikan masalah ini.
Fungsi terbina dalam JavaScript
Semua fungsi mempunyai akses kepada pembolehubah global.
Malah, dalam JavaScript, semua fungsi mempunyai akses kepada skop di atasnya.
JavaScript menyokong fungsi bersarang. Fungsi bersarang boleh mengakses pembolehubah fungsi peringkat atas.
Dalam contoh ini, fungsi sebaris plus() boleh mengakses pembolehubah pembilang fungsi induk:
Contoh

function add() {
  var counter = 0;
  function plus() {counter += 1;}
  plus();  
  return counter; 
}
Salin selepas log masuk

Jika kita boleh mengakses fungsi tambah() secara luaran, ini akan menyelesaikan dilema balas.
Kita juga perlu memastikan bahawa kaunter = 0 hanya dilaksanakan sekali.
Kami memerlukan penutupan.
Penutupan JavaScript
Ingat fungsi memanggil dirinya sendiri? Apakah fungsi ini?
Contoh

var add = (function () {
  var counter = 0;
  return function () {return counter += 1;}
})();

add();
add();
add();

// 计数器为 3

Salin selepas log masuk

Contoh analisis
Tambah pembolehubah menentukan nilai perkataan pulangan bagi fungsi yang memanggil itu sendiri.
Fungsi panggilan kendiri dilaksanakan sekali sahaja. Tetapkan pembilang kepada 0. dan mengembalikan ungkapan fungsi.
Pembolehubah tambah boleh digunakan sebagai fungsi. Bahagian yang menarik ialah ia memberikan akses kepada pembilang dari skop di atas fungsi.
Ini dipanggil penutupan JavaScript. Ia membolehkan fungsi mempunyai pembolehubah persendirian.
Kaunter dilindungi oleh skop fungsi tanpa nama dan hanya boleh diubah suai melalui kaedah tambah.

Nota
Penutupan ialah fungsi yang boleh mengakses pembolehubah dalam skop fungsi sebelumnya, walaupun fungsi sebelumnya telah ditutup.

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah maksud penutupan dalam ungkapan lambda C++? Apakah maksud penutupan dalam ungkapan lambda C++? Apr 17, 2024 pm 06:15 PM

Dalam C++, penutupan ialah ungkapan lambda yang boleh mengakses pembolehubah luaran. Untuk membuat penutupan, tangkap pembolehubah luar dalam ungkapan lambda. Penutupan memberikan kelebihan seperti kebolehgunaan semula, penyembunyian maklumat dan penilaian malas. Ia berguna dalam situasi dunia sebenar seperti pengendali acara, di mana penutupan masih boleh mengakses pembolehubah luar walaupun ia dimusnahkan.

Bagaimana untuk melaksanakan penutupan dalam ungkapan C++ Lambda? Bagaimana untuk melaksanakan penutupan dalam ungkapan C++ Lambda? Jun 01, 2024 pm 05:50 PM

Ungkapan C++ Lambda menyokong penutupan, yang menyimpan pembolehubah skop fungsi dan menjadikannya boleh diakses oleh fungsi. Sintaks ialah [capture-list](parameters)->return-type{function-body}. capture-list mentakrifkan pembolehubah untuk ditangkap Anda boleh menggunakan [=] untuk menangkap semua pembolehubah tempatan mengikut nilai, [&] untuk menangkap semua pembolehubah tempatan melalui rujukan, atau [variable1, variable2,...] untuk menangkap pembolehubah tertentu. Ungkapan Lambda hanya boleh mengakses pembolehubah yang ditangkap tetapi tidak boleh mengubah suai nilai asal.

Apakah kelebihan dan kekurangan penutupan dalam fungsi C++? Apakah kelebihan dan kekurangan penutupan dalam fungsi C++? Apr 25, 2024 pm 01:33 PM

Penutupan ialah fungsi bersarang yang boleh mengakses pembolehubah dalam skop fungsi luar Kelebihannya termasuk pengkapsulan data, pengekalan keadaan dan fleksibiliti. Kelemahan termasuk penggunaan memori, kesan prestasi dan kerumitan penyahpepijatan. Selain itu, penutupan boleh mencipta fungsi tanpa nama dan menyerahkannya kepada fungsi lain sebagai panggilan balik atau hujah.

Selesaikan masalah kebocoran memori yang disebabkan oleh penutupan Selesaikan masalah kebocoran memori yang disebabkan oleh penutupan Feb 18, 2024 pm 03:20 PM

Tajuk: Kebocoran memori disebabkan oleh penutupan dan penyelesaian Pengenalan: Penutupan ialah konsep yang sangat biasa dalam JavaScript, yang membenarkan fungsi dalaman mengakses pembolehubah fungsi luaran. Walau bagaimanapun, penutupan boleh menyebabkan kebocoran memori jika digunakan secara tidak betul. Artikel ini akan meneroka masalah kebocoran memori yang disebabkan oleh penutupan dan menyediakan penyelesaian serta contoh kod khusus. 1. Kebocoran memori disebabkan oleh penutupan Ciri penutupan ialah fungsi dalaman boleh mengakses pembolehubah fungsi luaran, yang bermaksud pembolehubah yang dirujuk dalam penutupan tidak akan dikumpul sampah. Jika digunakan secara tidak betul,

Peranan penutupan fungsi golang dalam pengujian Peranan penutupan fungsi golang dalam pengujian Apr 24, 2024 am 08:54 AM

Penutupan fungsi bahasa Go memainkan peranan penting dalam ujian unit: Menangkap nilai: Penutupan boleh mengakses pembolehubah dalam skop luar, membenarkan parameter ujian ditangkap dan digunakan semula dalam fungsi bersarang. Permudahkan kod ujian: Dengan menangkap nilai, penutupan memudahkan kod ujian dengan menghapuskan keperluan untuk menetapkan parameter berulang kali untuk setiap gelung. Tingkatkan kebolehbacaan: Gunakan penutupan untuk mengatur logik ujian, menjadikan kod ujian lebih jelas dan lebih mudah dibaca.

Panggilan berantai dan penutupan fungsi PHP Panggilan berantai dan penutupan fungsi PHP Apr 13, 2024 am 11:18 AM

Ya, kesederhanaan dan kebolehbacaan kod boleh dioptimumkan melalui panggilan berantai dan penutupan: panggilan berantai memaut fungsi panggilan ke antara muka yang lancar. Penutupan mewujudkan blok kod yang boleh digunakan semula dan pembolehubah akses di luar fungsi.

Kesan penunjuk fungsi dan penutupan pada prestasi Golang Kesan penunjuk fungsi dan penutupan pada prestasi Golang Apr 15, 2024 am 10:36 AM

Kesan penunjuk fungsi dan penutupan pada prestasi Go adalah seperti berikut: Penunjuk fungsi: Lebih perlahan sedikit daripada panggilan langsung, tetapi meningkatkan kebolehbacaan dan kebolehgunaan semula. Penutupan: Biasanya lebih perlahan, tetapi merangkumi data dan tingkah laku. Kes praktikal: Penunjuk fungsi boleh mengoptimumkan algoritma pengisihan dan penutupan boleh mencipta pengendali acara, tetapi ia akan membawa kerugian prestasi.

Bagaimanakah penutupan dilaksanakan di Jawa? Bagaimanakah penutupan dilaksanakan di Jawa? May 03, 2024 pm 12:48 PM

Penutupan dalam Java membenarkan fungsi dalaman mengakses pembolehubah skop luar walaupun fungsi luar telah keluar. Dilaksanakan melalui kelas dalaman tanpa nama, kelas dalam memegang rujukan kepada kelas luar dan memastikan pembolehubah luar aktif. Penutupan meningkatkan fleksibiliti kod, tetapi anda perlu sedar tentang risiko kebocoran memori kerana rujukan kepada pembolehubah luaran oleh kelas dalaman tanpa nama memastikan pembolehubah tersebut hidup.

See all articles