語法作用域 = 靜態作用域

靜態作用域 及 動態作用域 之間的差別牽涉直譯語言的解譯及運行流程。
  • 資料參考: 六角學院 JavaScript 核心篇

變數作用域也會依據宣告的方式不同,產生不同的作用域:
未宣告:全域變數
var 宣告:作用域在 函式 中
letconst 宣告:作用域在 {} 中

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值(綠色箭頭部分) 。

顯示出來的結果

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