語法作用域 = 靜態作用域
靜態作用域 及 動態作用域 之間的差別牽涉直譯語言的解譯及運行流程。
- 資料參考: 六角學院 JavaScript 核心篇
變數作用域也會依據宣告的方式不同,產生不同的作用域:
未宣告:全域變數var
宣告:作用域在 函式 中let
、const
宣告:作用域在{}
中


JS 採用的是語法作用域, 只要確定你的作用域, 就不會再改變。
範例1
範例1 測試結果如下:

利用全域console.log() 去測試, 可否顯示函式 callname()作用域的值。
顯示出來的結果

callname()作用域的變數value, 用外層console.log 去讀取會得到: Uncaught ReferenceError value is not defined
原因:
全域console.log() 無法去 callname() 作用域去讀取該變數!
範例2
此範例我們加入全域變數 let name =’張小姐’

我們會知道最後被執行的call2()函式
原因:
call2()函式內部有呼叫 callname() 函式, 而callname()函式作用域內並沒有宣告name變數, 所以callname() 函式會去全域變數查找name值(綠色箭頭部分) 。
顯示出來的結果

以上就是不同的作用域之間的關係, 希望大家不要搞混了。