cari

Rumah  >  Soal Jawab  >  teks badan

Apakah skop pembolehubah dalam JavaScript?

<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粉696891871P粉696891871465 hari yang lalu545

membalas semua(2)saya akan balas

  • P粉546257913

    P粉5462579132023-08-22 12:41:43

    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.

    balas
    0
  • P粉165522886

    P粉1655228862023-08-22 10:58:25

    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`!

    balas
    0
  • Batalbalas