理解JavaScript的變數,變數作用域,作用域鏈
阿新 • • 發佈:2019-01-07
1. JavaScript的變數分為兩種
全域性變數(Global variable):可以在指令碼的任何位置被引用。
區域性變數(Local variable):只存在於宣告它的那個函式的內部,這個函式之外是無法引用的。
2. 關鍵字var設定了變數的作用域
- 使用var宣告變數那麼這個變數就是區域性變數。JavaScript的全域性變數是全域性物件的屬性。
當使用var宣告一個變數時,這個變數時無法通過delete運算子刪除的。如:
var m =1; //t是一個不可刪除的全域性變數
n = 2; //建立全域性物件的一個可刪除的屬性
this.t = 3 ; //建立全域性物件的一個可刪除的屬性
delete m//false:變數沒有被刪除
delete n//true:變數被刪除了
delete this.t //true:變數被刪除了
- 沒有使用var就是一個全域性變數。 如:
function square(num){
global = num * num; //global是一個全域性變數
return global;
}
var local = 50; //local是一個區域性變數
var number = square(20); //number是一個區域性變數
alert(global); //結果:400
3.執行環境(execution context)
每個執行環境都有一個與之關聯的變數物件,環境中定義的所有的變數和函式都儲存在這個變數物件中。
4. 作用域鏈(scope chain)
JavaScript中每個函式都有一個執行環境,當代碼在一個環境中執行時,就會建立變數物件的作用域鏈。
作用域鏈用途:保證對執行環境有權訪問的變數和函式的有序訪問。
如果這個環境是函式,則將其活動物件作為變數物件。
作用域鏈的前端,始終都是當期那執行環境的程式碼所在的變數物件。作用域鏈中的下一個變數物件來自包含(外部)環境,而在再下一個變數物件則是來自下一個包含環境,這樣一直延續到全域性執行環境。
全域性執行環境的變數物件始終都是作用域鏈中的最後一個物件。
5. 作用域鏈組成
在JavaScript的最頂層程式碼,也就是不包含在任何函式定義內的程式碼,作用域鏈由一個全域性物件組成。
在不包含巢狀的函式體內,作用域鏈上有兩個物件:(1)定義函式引數和區域性變數物件。 (2)全域性物件。
在一個巢狀的函式體內,作用域鏈上至少有三個物件。
6. 理解作用域鏈
當定義一個函式時,它實際上儲存一個作用域鏈,當呼叫這個函式時,它建立一個新的物件來儲存它的區域性變數,並將這個物件新增到儲存它的作用域鏈上。
7. 作用域鏈訪問
內部環境可以通過作用域鏈訪問所在的外部環境,但是外部環境不能訪問內部環境的任何變數和函式。
例如:
var color1 = "blue";
function changeColor(){
var color2 = "red";
function swapColor(){
var temp = color2;
color2 = color1;
color1 = temp;
//這裡可以訪問color1,color2,temp
//(即swapColor這個函式作用域內)
}
//這裡可以訪問color1,color2,但是不能訪問temp
//(即在changeColor這個大函式的作用域內)
swapColor();
}
//這裡只能訪問color1 (即全域性作用域)
changeColor();