首頁  >  問答  >  主體

JavaScript中變數的作用域是什麼?

<p>JavaScript中變數的作用域是什麼?它們在函數內部和外部的作用域是否相同?或者這是否重要?此外,如果變數是全域定義的,它們儲存在哪裡? </p>
P粉696891871P粉696891871448 天前526

全部回覆(2)我來回復

  • P粉546257913

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

    Javascript使用作用域鏈來決定給定函數的作用域。通常有一個全域作用域,每個定義的函數都有自己的巢狀作用域。在另一個函數內定義的任何函數都有一個與外部函數連結的局部作用域。它始終是原始程式碼中的位置定義作用域。

    作用域鏈中的元素基本上是一個帶有指向其父作用域的指標的映射。

    在解析變數時,javascript從最內層作用域開始向外搜尋。

    回覆
    0
  • P粉165522886

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

    TLDR

    JavaScript具有詞法(也稱為靜態)作用域和閉包。這意味著你可以透過查看原始碼來確定標識符的作用域。

    四種作用域如下:

    1. 全域 - 對所有內容可見
    2. 函數 - 在函數內部可見(以及其子函數和區塊內部)
    3. 區塊 - 在區塊內部可見(以及其子區塊內部)
    4. 模組 - 在模組內部可見

    除了全域和模組作用域的特殊情況外,變數使用var(函數作用域)、let(區塊作用域)和const(區塊作用域)聲明。在嚴格模式下,大多數其他形式的識別碼聲明都具有區塊作用域。

    概述

    作用域是程式碼庫中標識符有效的區域。

    詞法環境是標識符名稱與與之關聯的值之間的對應。

    作用域由詞法環境的連結嵌套形成,每個嵌套層級對應於祖先執行上下文的詞法環境。

    這些連結的詞法環境形成了作用域「鏈」。標識符解析是沿著此鏈搜尋匹配標識符的過程。

    標識符解析只會向外進行。這樣,外部詞法環境就無法「看見」內部詞法環境。

    在決定JavaScript中識別符的作用域時,有三個相關因素:

    1. 標識符的宣告方式
    2. 標識符的宣告位置
    3. 是否處於嚴格模式非嚴格模式

    一些標識符的宣告方式:

    1. varletconst
    2. #函數參數
    3. catch區塊參數
    4. 函數宣告
    5. 命名函數表達式
    6. 全域物件上的隱式定義屬性(即,在非嚴格模式下省略var
    7. import語句
    8. eval

    一些標識符的宣告位置:

    1. 全域上下文
    2. 函數體
    3. 普通區塊
    4. 控制結構的頂部(例如,循環,if,while等)
    5. 控制結構體
    6. 模組

    宣告樣式

    var

    使用var聲明的標識符具有函數作用域,除非它們直接在全局上下文中聲明,此時它們將作為全局物件的屬性添加,並具有全局作用域。它們在eval函數中的使用有單獨的規則。

    let和const

    使用letconst聲明的識別碼具有區塊作用域,除非它們直接在全域上下文中聲明,此時它們具有全域作用域。

    注意:letconstvar#都被提升。這意味著它們的邏輯定義位置是其封閉作用域(區塊或函數)的頂部。但是,使用letconst聲明的變數在控制流程通過原始程式碼的宣告點之前不能被讀取或賦值。這個臨時期稱為暫時死區。

    function f() {
        function g() {
            console.log(x)
        }
        let x = 1
        g()
    }
    f() // 1 because x is hoisted even though declared with `let`!

    回覆
    0
  • 取消回覆