Js作用域

  • 31
  • 0
  • Js
  • 2020-01-16

靜態作用域 (變數的作用域在語法解析時,已設定)

       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);