標籤:範圍 ati 安全 效能 垃圾收集 存在 標識符 oca else
執行環境和範圍
一.全域變數和局部變數
每個執行環境都有與之關聯的變數對象(變數和函數儲存在這裡),全域執行環境是最外圍的執行環境,根據ECMA實現所在的宿主不同,表示的執行環境的對象也不同。在web瀏覽器中,全域執行環境被認為是window對象。
每個函數都有自己的執行環境,有自己對應的變數對象(arguments對象),當執行流進入一個函數時,函數的環境會被推進一個環境棧,函數執行完後,棧將其環境彈出,把控制權交給之前的執行環境。
當代碼在一個環境執行的時候,會建立變數對象的範圍鏈。
二.延長範圍鏈(有點不理解延長?)
try-catch中的catch(IE8前catch捕獲的錯誤對象被存在了執行環境的變數對象中,而不是catch語句的變數對象中,IE9修複了這問題)
with語句:
(function addUrl(){
var qs="?a=4";
with(location){
console.log("href : "+href);
//訪問location的屬性成功
var url=href+qs;
}
//console.log("href : "+href);
//訪問location的屬性失敗
console.log("url : "+url);
})();
//with的變數對象中包含了location對象的所有屬性和方法,這個變數對象被添加到了範圍鏈前端,而location的屬性和函數只能在with的範圍內訪問,在with之外的addUrl函數訪問不到,但with之外的addUrl函數可以訪問到with內建立的變數url。
(這裡和“沒有塊範圍”的知識有矛盾,因為這裡的with裡面的location屬性在with外面訪問不到,所以with內部本身有變數對象,但是下面的知識點又提及到語句沒有塊範圍)
(strict 模式下不允許使用with , with大量使用會影響效能)
三.沒有塊範圍
if else , for 等語句定義的變數會存放在最近的執行環境中,本身沒有執行環境。
使用var聲明的變數會自動被添加到最近的執行環境。
標識符的查詢是由近到遠。
記憶體
一.自動的垃圾收集機制
垃圾收集器會按照固定的時間間隔周期性地找出那些不再繼續使用的變數,然後釋放其佔有的記憶體。
有兩種方式:
標記清除(最常用,標記的方式有很多,原理一樣);
引用計數(容易造成循環參考,特別是IE8及其以下的js的COM對象!);
二.管理記憶體
出於安全考慮,一般電腦系統分配給wed瀏覽器的記憶體數量比傳統型應用程式少,所以要在有限的記憶體裡達到更好的效能,就可以使用解除引用的方式,此時解除一個值的引用不是說自動收回所佔用的記憶體,而是讓值脫離執行環境以便垃圾收集器下次啟動並執行時候回收。
【js】效能問題