語法作用域 lexical scope

CHEN
2 min readAug 25, 2019

--

語法作用域又稱為靜態作用域,而 JavaScript 就是採語法作用域。

作用域分為靜態作用域以及動態作用域,不同的程式語言可能有不同的作用域和名字解析。而同一語言內也可能存在多種作用域,隨實體的類型變化而不同。作用域類別影響變數的繫結方式,根據語言使用靜態作用域還是動態作用域變數的取值可能會有不同的結果。

而目前大多程式語言採用靜態作用域(語法作用域)規則,如C/C++C#PythonJavaJavaScript

lexical scope
圖片來源:六角學院課程

靜態作用域

變數的作用域在語法解析時,就已經確定作用域,且不會改變

動態作用域

變數的作用域在函式調用時才決定。

lexical scope

當 console.log(Ming); 移到函式外時就會出現 Ming is not defined。

因為 JavaScript 的作用域在函式裡,所以在函式裡宣告變數外層是讀不到的。向外查找找不到時就會顯現出 xxx is not defined。

lexical scope

而這個範例是因為當我們寫好 JavaScript 程式碼時,作用域就已經決定了(語法作用域),不會因執行過程中改變作用域。因此 value 的值依然還是 1,而非 fn2 函式中的 2。

--

--

CHEN
CHEN

No responses yet