執行環境(execution context)是javascript中最為重要的一個概念。
其中,全局執行環境是最外圍的一個執行環境。當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。
標識符解析是沿著作用域一級一級地搜索標識符的過程。搜索過程始終從作用域鏈的前端開始,然后逐級地向后回溯,直至找到標識符為止。
var color="blue"; function changColor(){ if(color=="blue") { color="red"; } else { color="blue"; } } changColor(); alert("Color is now "+color); //red
每個環境都可以向上搜索作用域鏈,以查詢變量和函數名,但是任何環境都不能通過向下搜索作用域鏈而進入另一個執行環境。
*延長作用域鏈 //p75
*沒有塊級作用域
if(true) { var color="blue"; } alert(color); //blue
如果在c、c++、或者java中,color會在if語句執行后銷毀,但是在js中,if語句中的變量聲明會將變量添加到當前的執行環境
for(var i = 0; i < 10; i++) { doSomething(i); } alert(i); //10
在js中,由for語句創建的變量i即使在for循環執行結束后,也依舊會存在于循環外部的執行環境中。
*查詢標識符
搜索標識符,搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標識符。如果在局部環境中找到該標識符,搜索過程停止,變量就緒。如果在局部環境中沒有找到標識符,就繼續沿作用域向上搜索。搜索過程將一直追溯到全局環境的變量對象。如果在全局環境中沒有找到,那么該變量沒有聲明。
(1)var color="blue"; function getColor(){ return color; } alert(getColor()); //blue
(2)var color="blue"; function getColor(){ var color="red"; return color; } alert(getColor()); //red
其中在第二段代碼中,任何位于局部變量color聲明之后的代碼,如果不使用window.color都無法訪問全局color變量
新聞熱點
疑難解答