Lingkup dan penutupan leksikal JavaScript



Terjemahan lingkungan JavaScript, Lingkup dan Penutup Leksikal .

Mari kita bicara tentang lingkungan. Planet besar kita adalah satu untuk semua. Selama pembangunan pabrik kimia baru, akan menyenangkan untuk mengisolasinya sehingga semua proses internal tidak meninggalkan perbatasannya. Kita dapat mengatakan bahwa lingkungan dan iklim mikro dari pabrik ini terisolasi dari lingkungan eksternal.

Program ini juga diatur. Apa yang Anda buat secara eksternal - fungsi eksternal, pernyataan kondisional, loop, dan blok lainnya - adalah lingkungan global eksternal.



Usia konstan, fungsi multiplier , dan variabel result berada di lingkungan eksternal. Komponen-komponen ini memiliki cakupan global. Lingkup adalah area di mana komponen tersedia.

Dalam hal ini, x adalah konstanta di dalam fungsi multiplier . Karena itu di dalam blok kode, ini adalah konstanta lokal, bukan global. Itu hanya terlihat di dalam fungsi, tetapi tidak di luar - cakupannya adalah lokal.

Fungsi multiplier memiliki komponen lain dari lingkup lokal - ini adalah argumen num . Mendefinisikannya lebih sulit daripada konstanta atau variabel, tetapi berperilaku kasar seperti variabel lokal.

Kami tidak memiliki akses eksternal ke x - sepertinya tidak ada:



console.log disebut x dalam lingkungan global yang tidak didefinisikan. Hasilnya, kami mendapat ReferenceError.

Kita dapat mengatur x secara global:



Kami memiliki x global dengan nilai yang diketahui, tetapi x lokal dalam fungsi multiplier masih terlihat hanya dari dalam. x ini tidak terhubung dengan cara apa pun - mereka berada di lingkungan yang berbeda. Meskipun namanya sama, mereka tidak bercampur.

Setiap blok kode dalam kawat gigi menjadi lingkungan lokal. Berikut adalah contoh penggunaan if :



Hal yang sama terjadi dengan while dan for loop.

Jadi lokal berarti tidak terlihat dari luar. Artinya, global terlihat di mana-mana, bahkan di dalam objek? Ya!



Variabel global a telah berubah di dalam fungsi changer . Fungsi berlaku hanya ketika dipanggil, bukan ketika didefinisikan, oleh karena itu awalnya a=0 , dan ketika dipanggil, changer mengambil nilai 1 .

Mudah menyerah pada godaan dan meletakkan segala sesuatu dalam lingkup global, melupakan semua kompleksitas lingkungan individu - tetapi ini adalah ide yang mengerikan. Variabel global membuat kode Anda sangat rapuh, elemen apa pun dapat merusak yang lain kapan saja. Karena itu, jangan gunakan lingkup global dan simpan semuanya di tempat.

Bagian II Lingkup leksikal


Lihatlah program ini:



Fungsi multiplier mengembalikan hasil perkalian a dan b . a diberikan secara internal, tetapi b tidak.

Saat mencoba melakukan operasi multiplikasi a*b , JavaScript mencari nilai a dan b . Dia mulai mencari ke dalam, dan kemudian pergi keluar, mempelajari satu area demi area, sampai dia menemukan apa yang dia cari, atau tidak mengerti bahwa itu tidak mungkin untuk ditemukan.

Oleh karena itu, dalam contoh ini, JavaScript mulai mencari a dalam area lokal - di dalam fungsi multiplier . Dia segera menemukan nilai dan pergi ke b . b dia tidak akan menemukan di lingkungan setempat, jadi dia melampauinya. Di sana dia belajar bahwa b adalah 10 . Jadi a*b berubah menjadi 5*10 , dan kemudian menjadi 50 .

Sepotong kode ini bisa berada di dalam fungsi lain, yang juga di dalam fungsi lain. Tanpa menemukan b di lapisan pertama, JavaScript akan terus mencari semuanya di lapisan baru dan baru, lebih jauh dan lebih jauh.

Harap dicatat bahwa a=7 tidak memengaruhi hasil perhitungan dengan cara apa pun: nilai a ditemukan di dalam, oleh karena itu, a eksternal tidak berperan.

Ini disebut lingkup leksikal. Cakupan komponen apa pun ditentukan oleh lokasi komponen ini dalam kode, dan blok bersarang memiliki akses ke area eksternal.

Bagian III. Sirkuit pendek


Lingkungan dan cakupan didukung oleh sebagian besar bahasa pemrograman, dan mekanisme ini memungkinkan pengenalan penutupan. Penutupan secara inheren adalah fungsi yang "mengingat" entitas eksternal yang digunakan secara internal.

Sebelum melanjutkan, mari kita ingat kembali bagaimana fungsi dibuat dan digunakan:



f adalah fungsi yang tidak berguna yang selalu mengembalikan 0 . Himpunan terdiri dari dua bagian - konstanta dan fungsi itu sendiri.

Penting untuk diingat bahwa ini adalah komponen yang terpisah. Komponen pertama adalah konstanta yang disebut f . Nilainya bisa berupa angka atau nilai string. Dalam hal ini, nilainya adalah fungsi.

Dalam pelajaran sebelumnya, kami mengutip analogi: konstanta seperti lembaran kertas dengan nama di satu sisi dan nilai di sisi lain. Jadi, f adalah selembar kertas dengan f ditulis di satu sisi dan deskripsi fungsi yang diluncurkan di sisi lain.

Saat memanggil fungsi ini:



“Kotak” baru dibuat berdasarkan deskripsi dari selembar kertas.

Kembali ke penutupan. Berikut ini contoh kode.



Fungsi createPrinter membuat konstanta name , dan kemudian fungsi yang disebut printName . Keduanya bersifat lokal untuk fungsi createPrinter dan hanya tersedia di dalamnya.

printName sendiri printName memiliki komponen lokal, tetapi ada akses ke ruang lingkup di mana ia dibuat, dan ke lingkungan eksternal, di mana konstanta diberi name .

Fungsi createPrinter mengembalikan fungsi printName . Ingatlah bahwa definisi fungsi adalah deskripsi fungsi yang berjalan, mereka hanya elemen data, seperti angka atau rantai. Oleh karena itu, kita dapat mengembalikan definisi fungsi dengan cara yang sama seperti kita mengembalikan angka.

Di lingkup luar, kita membuat myPrinter konstan dan menetapkan nilai kembali sebagai createPrinter . Fungsi dikembalikan, jadi myPrinter juga menjadi fungsi. Ketika Anda memanggilnya, King akan muncul di layar.

Inilah yang lucu: konstanta name dibuat di dalam fungsi createPrinter . Fungsi dipanggil dan dieksekusi. Seperti yang Anda tahu, ketika suatu fungsi selesai bekerja, ia tidak ada lagi. Kotak ajaib menghilang bersama dengan semua isinya.

Tapi dia mengembalikan fungsi lain yang entah bagaimana mengingat name konstanta. Jadi, ketika memanggil myPrinter kami mendapat King - nilai yang fungsi ingat, meskipun faktanya area ini tidak ada lagi.

Fungsi yang createPrinter pengembalianPrinter disebut penutupan. Penutupan adalah kombinasi dari fungsi dan lingkungan di mana ia didefinisikan. Fungsi "terlampir" itu sendiri informasi tertentu yang diterima dalam ruang lingkup.

Ini mungkin tampak seperti kekhasan dari JavaScript, tetapi menggunakan penutupan dengan bijak dapat membantu membuat kode Anda lebih menyenangkan, bersih, dan mudah dibaca. Prinsip fungsi pengembalian, seperti mengembalikan angka dan nilai string, memberi Anda lebih banyak kebebasan untuk bermanuver.

Source: https://habr.com/ru/post/id460861/


All Articles