JS變數作用域

jrue發表於2019-02-16

1. 全域性作用域

  • && var:不在任何函式體內定義的var變數具有全域性作用域(不同函式內部的同名變數互相獨立,互不影響:)
    && let和const: 不在任何塊級(即{}內)語句中定義的let變數或const常量具有全域性作用域(不同塊級(即{}內)語句內部的同名變數互相獨立,互不影響:)

    // 1.如果一個var變數在函式體內部申明,則該變數的作用域為整個函式體,在函式體外不可引用該變數:
    function garden() {
        var x = 1;
        x = x + 1;
    }
    x = x + 2; // ReferenceError! 無法在函式體外引用變數x
    
    // 2.如果一個let變數或const常量在塊級(即{}內)語句內部申明,則該變數的作用域為整個塊級(即{}內)語句,
    //   在塊級(即{}內)語句外不可引用該變數:
    if (true) {
        var upperA = `LetterA`;
    }
    upperA + `B`; // ReferenceError: upperA is not defined
    
    // 3.由於JavaScript的函式可以巢狀,此時,內部函式可以訪問外部函式定義的變數,反過來則不行:
    function garden() {
        let x = 1;
        function showtime() {
            let y = x + 1; // showtime可以訪問garden的變數x!
        }
        let z = y + 1;     // ReferenceError! garden不可以訪問showtime的變數y!
    }
  • 提醒:JavaScript的函式在查詢變數時從自身函式定義開始,從“內”向“外”查詢。如果內部函式定義了與外部函式重名的變數,則內部函式的變數將“遮蔽”外部函式的變數。

2. 區域性作用域

  • 在任何塊級(即{}內)語句中定義變數或常量具有全域性作用域。

相關文章