詞法(靜態)做用域和動態做用域

參考文章:git

JavaScript深刻之詞法做用域和動態做用域github

1.

JavaScript 採用詞法做用域(lexical scoping),也就是靜態做用域bash

2. 二者區別

由於 JavaScript 採用的是詞法做用域,函數的做用域在函數定義的時候就決定了。函數

而與詞法做用域相對的是動態做用域,函數的做用域是在函數調用的時候才決定的spa

例子:code

var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar();
複製代碼

假設JavaScript採用靜態做用域,讓咱們分析下執行過程:ip

執行 foo 函數,先從 foo 函數內部查找是否有局部變量 value,若是沒有,就根據書寫的位置,查找上面一層的代碼,也就是 value 等於 1,因此結果會打印 1。作用域

假設JavaScript採用動態做用域,讓咱們分析下執行過程:get

執行 foo 函數,依然是從 foo 函數內部查找是否有局部變量 value。若是沒有,就從調用函數的做用域,也就是 bar 函數內部查找 value 變量,因此結果會打印 2。it

前面咱們已經說了,JavaScript採用的是靜態做用域,因此這個例子的結果是 1

相關文章
相關標籤/搜索