Lingkungan eksekusi mendefinisikan data lain bahwa variabel atau fungsi memiliki izin untuk mengakses, dan menentukan perilaku masing -masing. Setiap lingkungan eksekusi memiliki objek variabel yang terkait dengannya.
Lingkungan eksekusi global adalah lingkungan eksekusi yang paling periferal. Bergantung pada lingkungan host di mana implementasi JavaScript berada, objek yang mewakili lingkungan eksekusi juga berbeda. Di browser web, lingkungan eksekusi global dianggap sebagai objek jendela. Oleh karena itu, semua variabel dan fungsi global dibuat sebagai properti dan metode objek jendela.
Objek Variabel: Semua variabel dan fungsi yang ditentukan dalam lingkungan disimpan dalam objek ini.
Rantai Lingkup: Ketika kode dieksekusi di lingkungan, rantai lingkup objek variabel dibuat. Tujuan dari rantai ruang lingkup adalah untuk memastikan akses tertib ke semua variabel dan fungsi yang memiliki izin untuk mengakses lingkungan eksekusi. Ujung depan rantai lingkup selalu merupakan objek variabel di lingkungan di mana kode yang saat ini dieksekusi berada.
Objek aktif: Objek aktif hanya berisi satu variabel di awal, yaitu objek argumen. Objek variabel berikutnya dalam rantai lingkup berasal dari lingkungan inklusi (eksternal), dan objek variabel berikutnya berasal dari lingkungan inklusi berikutnya. Ini berlanjut ke lingkungan eksekusi global; Objek variabel dari lingkungan eksekusi global selalu menjadi objek terakhir dalam rantai lingkup.
Parsing Identifier: Parsing Identifier adalah proses mencari pengidentifikasi satu per satu di sepanjang rantai lingkup. Proses pencarian selalu dimulai dari ujung depan rantai lingkup dan kemudian kembali selangkah demi selangkah sampai pengidentifikasi ditemukan.
Kode contoh:
var color = "blue"; function changeColor () {if (color === "blue") {color = "red"; } else {color = "blue"; }} changeColor (); alert ("Warna sekarang" + warna);Rantai lingkup fungsi changeColor () berisi dua objek: objek variabelnya sendiri (yang mendefinisikan objek argumen) dan objek variabel variabel global. Warna variabel dapat diakses di dalam fungsi karena dapat ditemukan dalam rantai lingkup ini.
Selain itu, variabel yang didefinisikan dalam lingkup lokal dapat digunakan secara bergantian dengan variabel global di lingkungan lokal, contoh:
var color = "blue"; function changeColor () {var OtherColor = "Red"; fungsi swapcolors () {var tempcolor = lainColor; OtherColor = warna; warna = tempcolor; // Anda dapat mengakses Color, OtherColor dan Tempcolor di sini} // Anda dapat mengakses warna dan warna lain di sini, tetapi Anda tidak dapat mengakses Tempcolor SwapColors ();} // Anda hanya dapat mengakses ColorChangecolor ();Kode di atas melibatkan 3 lingkungan eksekusi: lingkungan global, lingkungan pegangan ChangeColor () dan lingkungan lokal SwapColors ().
Ada warna variabel dan fungsi changeColor () dalam variabel global. Variabel lokal ChangeColor () berisi variabel lainColor dan fungsi fungsi swapcolors (), yang dapat mengakses warna dalam variabel global. Ada variabel tempcolor dalam variabel lokal swapcolors (). Di swapcolors (), Anda dapat mengakses warna dalam variabel global, atau variabel warna lainnya, karena kedua lingkungan tersebut adalah lingkungan eksekusi induknya. Rantai ruang lingkup contoh di atas adalah:
Di antara mereka, lingkungan internal dapat mengakses semua lingkungan eksternal melalui rantai ruang lingkup, tetapi lingkungan eksternal tidak dapat mengakses variabel dan fungsi apa pun di lingkungan internal . Koneksi antara variabel lingkungan bersifat linier dan berurutan. Setiap variabel hanya dapat mencari rantai ruang lingkup dari superior untuk meminta nama variabel dan fungsi, yaitu, permintaan pertama variabel atau nama fungsi dalam fungsi ini, dan jika tidak diminta ke rantai lingkup sebelumnya sampai lingkup atas. Namun, tidak ada lingkungan yang dapat mencari rantai ruang lingkup dan memasuki lingkungan eksekusi lainnya.
Parameter fungsi juga diperlakukan sebagai variabel, sehingga aturan aksesnya sama dengan variabel lain di lingkungan eksekusi.
1. Perpanjang rantai lingkup
Rantai lingkup diperpanjang ketika aliran eksekusi memasuki salah satu pernyataan berikut:
• Tangkap blok pernyataan mencoba-tangkapan
• dengan pernyataan
Kedua pernyataan ini akan menambahkan objek variabel ke ujung depan ruang lingkup.
Untuk pernyataan dengan dengan variabel yang ditentukan ditambahkan ke rantai lingkup. Untuk pernyataan tangkapan, objek variabel baru dibuat, yang berisi deklarasi objek yang salah dilemparkan.
Misalnya:
fungsi buildUrl () {var qs = "? debug = true"; dengan (lokasi) {var url = href + qs; } return url;}Pernyataan dengan menerima objek lokasi, sehingga objek variabelnya berisi properti dan metode yang digunakan oleh objek lokasi, dan objek variabel ini ditambahkan ke ujung depan rantai ruang lingkup. Saat mengacu pada variabel HREF dalam pernyataan dengan dengan dengan dengan baik (sebenarnya mengacu pada lokasi.href), itu dapat ditemukan dalam variabel lingkungan saat ini. Saat mengacu pada q variabel, variabel yang didefinisikan dalam buildUrl () dirujuk, yang terletak di objek variabel lingkungan fungsi. Adapun pernyataan dengan dengan variabel bernama URL didefinisikan, sehingga URL menjadi bagian dari lingkungan eksekusi fungsi dan dapat dikembalikan sebagai nilai fungsi.
2. Tidak ada ruang lingkup level blok
Dalam JavaScript, kawat gigi keriting tertutup tidak memiliki ruang lingkup sendiri. Lihat kode berikut:
if (true) {var color = "blue";} alert (color); // "biru"Dalam JavaScript, deklarasi variabel yang dibuat oleh pernyataan IF/untuk menambahkan variabel ke lingkungan eksekusi saat ini. Misalnya:
untuk (var i = 0; i <10; i ++) {dosomething (i);} alert (i); // 10Daur Ulang Sampah
Mirip dengan Java, JavaScript juga memiliki mekanisme daur ulang sampah otomatis. Lingkungan eksekusi bertanggung jawab untuk mengelola memori yang digunakan selama eksekusi kode. Saat menulis program, tidak perlu untuk masalah penggunaan memori terkait. Alokasi memori yang diperlukan dan daur ulang memori yang tidak berguna sepenuhnya diimplementasikan. Prinsip mekanisme pengumpulan sampah adalah: cari tahu variabel yang tidak lagi digunakan, dan kemudian membebaskan memori yang ditempati. Untuk melakukan ini, pengumpul sampah akan melakukan operasi ini secara berkala pada interval waktu tetap (atau waktu pengumpulan yang telah ditentukan selama eksekusi kode).
Sebelum melakukan pengumpulan sampah, Anda harus menentukan apakah sumber daya tidak berguna dan menandai variabel yang tidak lagi digunakan untuk mendaur ulang memori mereka di masa depan. Biasanya ada dua implementasi strategi untuk mengidentifikasi variabel yang tidak berguna.
1 Tandai jelas
Cara paling umum untuk pengumpulan sampah di JavaScript adalah pembersihan penanda. Ketika variabel memasuki lingkungan, itu ditandai sebagai "memasuki lingkungan"; Ketika sebuah variabel meninggalkan lingkungan, itu ditandai sebagai "keluar dari lingkungan". Ketika pengumpul sampah berjalan, itu menandai semua variabel yang digunakan. Kemudian menghilangkan tag variabel di lingkungan dan variabel yang dirujuk oleh variabel di lingkungan. Setelah itu, variabel yang ditandai akan dianggap sebagai variabel yang siap dihapus. Akhirnya, pengumpul sampah melengkapi pekerjaan kliring memori, menghancurkan nilai -nilai yang ditandai dan mendaur ulang ruang memori yang mereka tempati.
2. Hitungan referensi
Hitungan referensi mengacu pada berapa kali setiap nilai dirujuk. When a variable is declared and a reference type value is assigned to the variable, the number of references to this value is 1. If the same value is assigned to another variable, the number of references to the value is increased by 1. Conversely, if the variable containing the reference to this value takes another variable, the number of references to this value is reduced by 1. When the number of references to this variable is 0, it means that there is no way to refer to this variable again, so its Ruang memori dapat direklamasi. Lain kali kolektor sampah berjalan, mendaur ulang memori yang ditempati oleh nilai -nilai ini dengan nol referensi.
Satu masalah yang penghitungan referensi dapat menyebabkan referensi daur ulang. Misalnya:
function problem () {var obja = objek baru (); var objb = objek baru (); obja.someotherobj = objb; objb.someotherobj = obja;}Dalam contoh di atas, OBJA dan OBJB merujuk satu sama lain melalui atribut. Setelah fungsi eksekusi selesai, OBJA dan OBJB akan terus ada dan jumlah referensi mereka tidak akan 0. Situasi ini akan menyebabkan memori yang ditempati oleh OBJA dan OBJB untuk didaur ulang.
Artikel di atas secara singkat berbicara tentang JavaScript: Lingkungan Eksekusi, Lingkup dan Koleksi Sampah adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.