Apakah skop pembolehubah dalam JavaScript?
P粉696891871
P粉696891871 2023-08-21 15:35:39
0
2
531
<p>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? </p>
P粉696891871
P粉696891871

membalas semua(2)
P粉546257913

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.

P粉165522886

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:

  1. Global - kelihatan kepada semua kandungan
  2. Fungsi - Kelihatan di dalam fungsi (dan di dalam subfungsi dan bloknya)
  3. Blok - Kelihatan di dalam blok (dan di dalam sub-bloknya)
  4. Modul - Kelihatan dalam modul

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 memutuskan skop pengecam dalam JavaScript:

  1. Cara mengisytiharkan pengecam
  2. Kedudukan pengisytiharan pengecam
  3. Sama ada dalam mod ketat atau mod tidak ketat

Beberapa cara untuk mengisytiharkan pengecam:

  1. varletconst
  2. Parameter fungsi
  3. tangkap parameter blok
  4. Pengisytiharan fungsi
  5. Ungkapan fungsi bernama
  6. Sifat yang ditakrifkan secara tersirat pada objek global (iaitu ditinggalkan var dalam mod tidak ketat)
  7. importKenyataan
  8. eval

Lokasi pengisytiharan beberapa pengecam:

  1. Konteks global
  2. Badan berfungsi
  3. Blok biasa
  4. Atas struktur kawalan (cth. gelung, jika, sementara, dsb.)
  5. Struktur kawalan
  6. Modul

Gaya pengisytiharan

var

Pengecam var声明的标识符具有函数作用域,除非它们直接在全局上下文中声明,此时它们将作为全局对象的属性添加,并具有全局作用域。它们在eval diisytiharkan 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

.

letconstbiar dan const Pengecam

diisytiharkan menggunakan 🎜 mempunyai skop blok 🎜 melainkan ia diisytiharkan secara langsung dalam konteks global, dalam hal ini ia mempunyai skop global. 🎜

Nota: letconstvar都被提升。这意味着它们的逻辑定义位置是其封闭作用域(块或函数)的顶部。但是,使用letconstPembolehubah 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`!
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!