1. 程式人生 > >JavaScript深入之 執行上下文(一):作用域

JavaScript深入之 執行上下文(一):作用域

作用域

作用域是指程式原始碼中定義變數的區域。 作用域規定了如何查詢變數,也就是確定當前執行程式碼對變數的訪問許可權。下面我們來看看作用域的兩種解析方式。

作用域兩種解析方式:

  • 靜態作用域:js使用
  • 動態作用域:java、c++等使用

1、靜態作用域:

JavaScript 採用就是詞法作用域(lexical scoping),也就是靜態作用域。使用詞法環境來管理。 一段程式碼執行前,先初始化詞法環境。

下面程式碼若使用靜態作用域:

var x = 10;
function foo(){
    console.log(x);
}
function bar(){
    var x = 20;
    foo();
}
bar();//10

看下面作用域鏈:執行bar函式時,在bar的作用域(scope)中找不到foo函式,然後再到全域性作用域(global scope)中找,正好全域性作用域中有,然後執行foo; 執行foo時又找不到x變數,然後到全域性作用域中找,發現x=10,然後列印 10 在這裡插入圖片描述

2、動態作用域:

程式執行時決定。動態作用域一般是使用動態棧來管理。 下面程式碼若使用動態作用域:

var x = 10;
function foo(){
    console.log(x);
}
function bar(){
    var x = 20;
    foo();
}
bar();//20

看下圖動態棧:在執行過程中, (1)首先var x = 10,把x:10放入棧內; (2)之後再依次執行foo,bar函式的宣告,我們再把foo,bar函式放入棧內 (3)在執行bar()時,首先執行var x = 20,我們把x:20放入棧內 (4)然後執行bar函式裡面的foo函式,由於foo要列印x變數,所以我們在棧裡找到最近的x值。為20,所以列印結果為20. 在這裡插入圖片描述