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. 區域性作用域
-
在任何塊級(即{}內)語句中定義變數或常量具有全域性作用域。