【js】效能問題

來源:互聯網
上載者:User

標籤:範圍   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】效能問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.