靜態作用域 (變數的作用域在語法解析時,已設定)
Js
Lexical scope 語法作用域
動態作用域 (變數的作用域在函式調用才設定)
*************************************************************************************************
~~~~~~~~~~~~~~~~~~~~~~~
作用域找尋流程
預先解析 (創造)
所有變數,在代碼運行前,已宣告變數
所有函數,在代碼運行前,已宣告函數區塊
逐行解析 (執行)
表達式 : = + - * / …
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
變數
var a = 'test'; 於該區域下的作用域
b = 123; 於全域下的作用域 window.b
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
靜態作用域 (變數的作用域在語法解析時,已設定)
var a = 1; //lexical scope
function test (){
console.log(a);
}
動態作用域 (變數的作用域在函式調用才設定)
var value;
function fn1(){
console.log(value);
}
function fn2(){
value = 2;
fn1(); //未指定value值,所以往上找
}
fn2();
~~~~~~~~~~~~~~~~~~~~~~~~~~~
預先解析 :
1行 var a;
2行 test = function() {};
逐行解析 :
1行 a = 1;
6行 函數使用
函數預先解析 : 無
函數逐行解析 :
3行 : alert(a) show : 1
4行 : 設定a = 2
7行 alert(a) show : 2
~~~~~~~~~~~~~~~~~~~~~~~~~~
範例 1 :
1 var a = 1;
2 function test() {
3 alert(a);
4 a = 2 ;
5 }
6 test();
7 alert(a);
~~~~~~~~~~~~~~~~~~~~~~~~~
限阱 若函式內已預解析變數時,先已函式內為主,而非全域
範例 2 :
1 var a = 1;
2 function test() {
3 alert(a); -->限阱 下方已訂義 a 變數,但未給值,所以為undefind
4 var a = 2 ;
5 }
6 test();
7 alert(a);