Pertama, berikut ini adalah tiga kode yang menjelaskan ruang lingkupnya
// =========== Contoh 1 ============== Var scope = 'global'; function fn () {alert (scope); var scope = 'lokal'; peringatan (lingkup);} fn (); // hasil output? peringatan (lingkup); // hasil output? // ============= Contoh 2 ============ Var scope = 'Global'; function fn () {alert (scope); scope = 'lokal'; peringatan (lingkup);} fn (); // hasil output? peringatan (lingkup); // hasil output? // ============= Contoh 3 =========== Var scope = 'Global'; function fn (scope) {alert (scope); scope = 'lokal'; peringatan (lingkup);} fn (); // hasil output? peringatan (lingkup); // hasil output?Ketiga kode ini hanya memiliki perbedaan kecil, tetapi hasilnya sangat berbeda. Contoh 1 Output [tidak terdefinisi, lokal, global], contoh 2 output [global, lokal, lokal], contoh 3 output [tidak ditentukan, lokal, global]. Jika Anda tidak dapat menjawab dengan benar, itu berarti bahwa Anda belum memahami karakteristik ruang lingkup JavaScript.
Apa itu ruang lingkup?
Seseorang mungkin bertanya: Apa ruang lingkup variabel A? Saya bertanya lagi nanti: Apa lingkup fungsi A? Apa saja cakupan variabel dan fungsi?
Pertama -tama mari kita lihat apa arti "ruang lingkup". Saat "SCOPE" dipecah, itu berarti "fungsi" dan "domain"
Lingkup adalah kisaran variabel dan fungsi yang dapat diakses, atau area di mana variabel atau fungsi bekerja.
1.Scope of JavaScript Fungsi:
Area dalam fungsi adalah ruang lingkup fungsi, dan kedua variabel dan fungsi dapat mengakses operasi di area ini. Area di luar fungsi terluar disebut ruang lingkup global, dan area di dalam fungsi disebut ruang lingkup lokal.
2. Lingkup variabel JavaScript:
Di wilayah di mana variabel terletak di kode sumber, ruang lingkup variabel ini, dan variabel dapat diakses dan dioperasikan dalam area ini. Variabel yang didefinisikan dalam ruang lingkup global disebut variabel global, dan variabel yang didefinisikan dalam fungsi disebut variabel lokal.
Untuk hanya memahami, kode sumber JS dibagi menjadi area blok dengan fungsi {}. Jika area ini mengubah identitas mereka, mereka adalah ruang lingkup fungsi tertentu atau variabel tertentu. Lingkup variabel dan ruang lingkup fungsi dapat merujuk ke area yang sama dalam kode sumber.
Rantai Lingkup
Rantai lingkup adalah mekanisme pencarian variabel dan fungsi dalam JavaScript. Ini menentukan ruang lingkup variabel dan fungsi, yaitu ruang lingkup. Pahami prinsip rantai ruang lingkup, dan Anda dapat memahami tiga contoh dalam artikel sebelumnya, sehingga Anda dapat mengetahui alasan dan alasannya.
Rantai Lingkup adalah konsep dalam dokumentasi ECMascript-262. Mesin JavaScript diimplementasikan sesuai dengan dokumentasi ECMASCRIPT-262. Memahami prinsip kerja mesin JavaScript kondusif untuk pemahaman kita tentang karakteristik JavaScript, tetapi sebagian besar pemrogram JS tidak akan memahami teknologi yang sangat mendasar. Oleh karena itu, ketika membaca dokumentasi ecmascript-262, kita dapat memiliki cara intuitif untuk mensimulasikan prinsip kerja mesin JavaScript.
Artikel ini akan menjelaskan prinsip pembentukan rantai ruang lingkup melalui edisi ketiga ECMascript-262-3 pada tahun 1999, dan akan memperkenalkan beberapa konsep seperti lingkungan eksekusi, objek variabel dan objek aktif, objek argumen, rantai ruang lingkup, dll. Pada tahun 2009, edisi kelima ecmascript-262-5 dirilis. Perbedaannya adalah bahwa konsep -konsep seperti objek variabel dan objek aktif dibatalkan, dan konsep -konsep baru seperti lingkungan leksikal dan catatan lingkungan diperkenalkan, jadi jangan membingungkan konsep kedua versi tersebut.
1. Konteks Ekseksi
Konteks eksekusi juga diterjemahkan ke dalam konteks eksekusi. Ketika parser memasuki kode ecmascript yang dapat dieksekusi, parser memasuki lingkungan eksekusi. Lingkungan eksekusi aktif membentuk tumpukan logis. Lingkungan eksekusi di bagian atas tumpukan logis ini adalah lingkungan eksekusi yang berjalan saat ini.
Catatan: Ada tiga jenis kode yang dapat dieksekusi dalam ecmascript, global, fungsi dan eval. Lingkungan global adalah kode yang dapat dieksekusi global, dan fungsi adalah kode fungsi yang dapat dieksekusi. Tumpukan logika adalah format penyimpanan data khusus, ditandai dengan 'pertama masuk dan keluar, dan kemudian masuk dan keluar'. Menambahkan data pertama -tama akan didorong ke bagian atas tumpukan logika, dan menghapus data harus dihapus dari atas.
Objek Variabel, Objek Aktif, dan Objek Argumen
Setiap lingkungan eksekusi memiliki objek variabel yang terkait dengannya. Ketika parser memasuki lingkungan eksekusi, objek variabel akan dibuat, yang memegang referensi ke variabel dan fungsi yang dinyatakan dalam lingkungan eksekusi saat ini.
Objek variabel adalah konsep abstrak. Dalam lingkungan eksekusi yang berbeda, objek variabel memiliki identitas yang berbeda. Sebelum parser memasuki lingkungan eksekusi apa pun, objek global dibuat. Ketika parser memasuki lingkungan eksekusi global, objek global bertindak sebagai objek variabel. Ketika parser memasuki fungsi, objek aktif akan dibuat sebagai objek variabel.
2. Dua tahap saat parser memproses kode
Kita semua tahu bahwa parser JavaScript mem -parsing kode satu per satu, apakah itu tikar? Ini melibatkan dua tahap ketika parser memproses kode, mem -parsing kode dan menjalankan kode.
Ketika parser memasuki lingkungan eksekusi, objek variabel akan menambah variabel dan fungsi yang dinyatakan dalam lingkungan eksekusi sebagai propertinya, yang berarti bahwa variabel dan fungsi tersedia sebelum deklarasi, dan nilai variabel tidak ditentukan. Ini adalah alasan untuk promosi variabel dan deklarasi fungsi (mengangkat). Pada saat yang sama, rantai lingkup dan ini ditentukan. Proses ini adalah tahap parsing, umumnya dikenal sebagai pra-parsing. Kemudian parser mulai mengeksekusi kode, menambahkan referensi ke nilai yang sesuai ke variabel, dan memperoleh hasil eksekusi. Proses ini adalah tahap eksekusi.
Mari kita beri nama dua chestnut yang lezat:
var a = 123; var b = "abc"; function c () {alert ('11 ');}Setelah kode penguraian dan pelaksanaan di lingkungan global di atas, objek global akan digunakan sebagai objek variabel dan data berikut akan disimpan.
fungsi testfn (a) {var b = "123"; fungsi c () {alert ("ABC"); }} testfn (10);Ketika parser memasuki lingkungan eksekusi fungsi, objek aktif akan dibuat sebagai objek variabel. Objek aktif juga akan membuat objek argumen. Objek argumen adalah parameter yang ditetapkan untuk menyimpan parameter. Inilah sebabnya kami dapat menggunakan argumen [0] dan seterusnya saat menulis fungsi.
3. Rantai Lingkungan
Setiap lingkungan eksekusi memiliki rantai ruang lingkup yang terkait dengannya. Itu didefinisikan ketika parser memasuki lingkungan eksekusi. Rantai lingkup adalah daftar objek yang digunakan untuk mengambil variabel dan fungsi di setiap objek variabel. Ini memastikan bahwa lingkungan eksekusi memiliki hak untuk mengakses variabel dan fungsi mana. Misalnya, itu adalah kastanye.
var a = '123'; function testfn (b) {var c = 'abc'; fungsi testfn2 () {var d = 'efg'; waspada (a); } testfn2 ();} testfn (10);Variabel A tidak dinyatakan dalam testfn2. Mengapa testfn2 dapat memanggil variabel global a? Bagaimana seluruh proses terjadi? Silakan lihat gambar di bawah ini.
Ketika parser memasuki lingkungan eksekusi global, variabel dan fungsi hanya ditemukan dalam objek global saat menyebutnya.
Ketika parser memasuki lingkungan eksekusi fungsi testfn, properti internal fungsi [[ruang lingkup]] pertama kali diisi pada objek global, dan kemudian objek aktif testfn ditambahkan ke objek global untuk membentuk rantai ruang lingkup.
Ketika parser memasuki lingkungan eksekusi fungsi testfn2, properti internal fungsi [[ruang lingkup]] pertama kali diisi dalam rantai lingkup induk, dan kemudian objek aktif testfn2 saat ini ditambahkan ke ujung depan rantai ruang lingkup untuk membentuk rantai ruang lingkup baru.
Ketika TestFn2 memanggil variabel A, pencarian pertama di objek aktif testfn2 saat ini. Jika tidak ditemukan, ikuti rantai ruang lingkup ke atas. Jika tidak ditemukan, lihat rantai ruang lingkup. Jika tidak ditemukan, lihat rantai lingkup sampai ditemukan di objek global terakhir, jika tidak kesalahan akan dilaporkan. Oleh karena itu, variabel lingkungan eksternal dapat dipanggil di dalam fungsi, dan variabel lingkungan eksternal tidak dapat dipanggil di dalam fungsi. Ini adalah prinsip karakteristik ruang lingkup.