Apakah skop pembolehubah dalam JavaScript? Adakah mereka mempunyai skop yang sama di dalam dan di luar fungsi? Atau adakah ia penting? Juga, jika pembolehubah ditakrifkan secara global, di manakah ia disimpan?
Javascript menggunakan rantai skop untuk menentukan skop fungsi yang diberikan. Biasanya terdapat skop global dan setiap fungsi yang ditentukan mempunyai skop bersarang sendiri. Mana-mana fungsi yang ditakrifkan dalam fungsi lain mempunyai skop setempat yang dikaitkan dengan fungsi luar. Ia sentiasa lokasi dalam kod sumber di mana skop ditakrifkan.
Satu elemen dalam rantaian skop pada asasnya ialah peta dengan penunjuk kepada skop induknya.
Apabila menghuraikan pembolehubah, JavaScript bermula dari skop paling dalam dan mencari ke luar.
JavaScript mempunyai skop dan penutupan leksikal (juga dipanggil statik). Ini bermakna anda boleh menentukan skop pengecam dengan melihat kod sumber.
Empat skop tersebut adalah seperti berikut:
Global - kelihatan kepada semua kandungan
Fungsi - Kelihatan di dalam fungsi (dan di dalam subfungsi dan bloknya)
Blok - Kelihatan di dalam blok (dan di dalam sub-bloknya)
Modul - Kelihatan dalam modul
Kecuali untuk kes khas skop global dan modul, pembolehubah diisytiharkan menggunakanvar(函数作用域)、let(块作用域)和const(skop blok). Dalam mod ketat, kebanyakan bentuk pengisytiharan pengecam lain mempunyai skop blok.
Gambaran keseluruhan
Skop ialah kawasan dalam pangkalan kod di mana pengecam adalah sah.
Persekitaran leksikal ialah pemetaan antara nama pengecam dan nilai yang dikaitkan dengannya.
Skop dibentuk oleh sarang berpaut persekitaran leksikal, dengan setiap tahap sarang sepadan dengan persekitaran leksikal konteks pelaksanaan nenek moyang.
Persekitaran leksikal yang dikaitkan ini membentuk skop "rantai". Peleraian pengecam ialah proses mencari sepanjang rantai ini untuk pengecam yang sepadan.
Penyelesaian pengecam hanya akan dilakukan secara luaran. Dengan cara ini, persekitaran leksikal luar tidak dapat "melihat" persekitaran leksikal dalaman.
Terdapat tiga faktor yang berkaitan semasa memutuskanskoppengecam dalam JavaScript:
Sifat yang ditakrifkan secara tersirat pada objek global (iaitu ditinggalkanvardalam mod tidak ketat)
importKenyataan
eval
Lokasi pengisytiharan beberapa pengecam:
Konteks global
Badan berfungsi
Blok biasa
Atas struktur kawalan (cth. gelung, jika, sementara, dsb.)
Struktur kawalan
Modul
Gaya pengisytiharan
var
Pengecamvar声明的标识符具有函数作用域,除非它们直接在全局上下文中声明,此时它们将作为全局对象的属性添加,并具有全局作用域。它们在evaldiisytiharkan menggunakan
mempunyai skop fungsi
melainkan ia diisytiharkan secara langsung dalam konteks global, dalam hal ini ia ditambah sebagai sifat objek global dan mempunyai skop global. Terdapat peraturan berasingan untuk kegunaannya dalam fungsi
.
let和constbiar dan constPengecam
diisytiharkan menggunakan mempunyai skop blok melainkan ia diisytiharkan secara langsung dalam konteks global, dalam hal ini ia mempunyai skop global.
Nota:let,const和var都被提升。这意味着它们的逻辑定义位置是其封闭作用域(块或函数)的顶部。但是,使用let和constPembolehubah yang diisytiharkan tidak boleh dibaca atau diberikan sehingga aliran kawalan melepasi titik pengisytiharan dalam kod sumber. Tempoh sementara ini dipanggil zon mati sementara.
function f() { function g() { console.log(x) } let x = 1 g() } f() // 1 because x is hoisted even though declared with `let`!
Javascript menggunakan rantai skop untuk menentukan skop fungsi yang diberikan. Biasanya terdapat skop global dan setiap fungsi yang ditentukan mempunyai skop bersarang sendiri. Mana-mana fungsi yang ditakrifkan dalam fungsi lain mempunyai skop setempat yang dikaitkan dengan fungsi luar. Ia sentiasa lokasi dalam kod sumber di mana skop ditakrifkan.
Satu elemen dalam rantaian skop pada asasnya ialah peta dengan penunjuk kepada skop induknya.
Apabila menghuraikan pembolehubah, JavaScript bermula dari skop paling dalam dan mencari ke luar.
TLDR
JavaScript mempunyai skop dan penutupan leksikal (juga dipanggil statik). Ini bermakna anda boleh menentukan skop pengecam dengan melihat kod sumber.
Empat skop tersebut adalah seperti berikut:
Kecuali untuk kes khas skop global dan modul, pembolehubah diisytiharkan menggunakan
var
(函数作用域)、let
(块作用域)和const
(skop blok). Dalam mod ketat, kebanyakan bentuk pengisytiharan pengecam lain mempunyai skop blok.Gambaran keseluruhan
Skop ialah kawasan dalam pangkalan kod di mana pengecam adalah sah.
Persekitaran leksikal ialah pemetaan antara nama pengecam dan nilai yang dikaitkan dengannya.
Skop dibentuk oleh sarang berpaut persekitaran leksikal, dengan setiap tahap sarang sepadan dengan persekitaran leksikal konteks pelaksanaan nenek moyang.
Persekitaran leksikal yang dikaitkan ini membentuk skop "rantai". Peleraian pengecam ialah proses mencari sepanjang rantai ini untuk pengecam yang sepadan.
Penyelesaian pengecam hanya akan dilakukan secara luaran. Dengan cara ini, persekitaran leksikal luar tidak dapat "melihat" persekitaran leksikal dalaman.
Terdapat tiga faktor yang berkaitan semasa memutuskanskoppengecam dalam JavaScript:
Beberapa cara untuk mengisytiharkan pengecam:
var
,let
和const
var
dalam mod tidak ketat)import
Kenyataaneval
Lokasi pengisytiharan beberapa pengecam:
Gaya pengisytiharan
var
Pengecam
mempunyai skop fungsivar
声明的标识符具有函数作用域,除非它们直接在全局上下文中声明,此时它们将作为全局对象的属性添加,并具有全局作用域。它们在eval
diisytiharkan menggunakanmelainkan ia diisytiharkan secara langsung dalam konteks global, dalam hal ini ia ditambah sebagai sifat objek global dan mempunyai skop global. Terdapat peraturan berasingan untuk kegunaannya dalam fungsi
.
diisytiharkan menggunakan mempunyai skop blok melainkan ia diisytiharkan secara langsung dalam konteks global, dalam hal ini ia mempunyai skop global.let
和const
biar dan constPengecamNota:
let
,const
和var
都被提升。这意味着它们的逻辑定义位置是其封闭作用域(块或函数)的顶部。但是,使用let
和const
Pembolehubah yang diisytiharkan tidak boleh dibaca atau diberikan sehingga aliran kawalan melepasi titik pengisytiharan dalam kod sumber. Tempoh sementara ini dipanggil zon mati sementara.