是js中最爲重要的一個概念,它定義了變量或函數有權訪問的其餘數據,決定了它們各自的行爲,每一個函數都有本身的執行環境.javascript
每一個執行環境都有與之關聯的變量對象.它保存了這個環境中定義的全部變量和函數前端
當執行流進入一個函數,函數的環境就會被推入一個環境棧中,當執行環境中的全部代碼執行完畢,棧將其環境彈出,把控制權返回給以前的執行環境.保存在該環境中的全部變量和函數定義也隨之銷燬java
當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈.它的用途是保證對執行環境有權訪問的全部變量和函數有序訪問.做用域的前端,始終是當前代碼所在環境的變量對象.
若是這個環境是個函數,則將其活動對象做爲變量對象.活動對象一開始只有一個變量,即arguments對象(是一個相似數組的對象, 對應於傳遞給函數的參數),它只存在於局部環境中
做用域鏈中的下一個變量對象來自包含當前環境的環境(能夠理解爲父函數),而下一個變量對象則來自下一個包含環境.這樣一直延續到全局執行環境;全局執行環境的變量對象始終都是
做用域鏈的最後一個對象變量.標識符解析沿着做用域鏈一層一層往上查找,直到找到爲止.數組
一個例子:函數
var color = "blue"; function changeColor(){ var anotherColor = "red"; function swapColor(){ var tempColor = "green"; //這裏能訪問tempColor,anotherColor和color } //這裏能訪問anotherColor和color } //這裏只能訪問color changeColor();
注意 : 函數的參數也被看成變量來對待,它就至關於在當前環境中申明的一個變量.ui
當執行流進入下列任何一個語句,做用域鏈就會被加長.try-catch語句的catch塊
和with語句
url
一個例子:debug
function buildUrl() { var qs = "?debug=true"; with(location){ var url = href + qs; } return url; }
摘抄自 javascript高級程序設計(第三版) 4.2.1章.目前不是很理解.來日再改.設計
js不像其餘類C語言,由花括號封閉的代碼塊有本身的做用域.code
if (true) { var color = "blue"; } alert(color); //"blue"
這裏是在一個if語句中定義了變量color.若是是類C語言中,color會在if執行完後被銷燬,而js則是把這個變量添加到當前的執行環境裏(這裏就是全局環境).
在使用for語句時這一點就很重要.
for (var i=0; i < 10; i++){ doSomething(i); } alert(i); //10 //i已經跑到了執行環境中了,for循環結束了,i 也依然存在