首頁 > web前端 > js教程 > 主體

實現JavaScript高效能的資料存儲

黄舟
發布: 2017-02-20 14:29:02
原創
1225 人瀏覽過

1.JavaScript中四種基本資料存取位置:字面量,本地變量,數組元素,物件成員。

一般來說:[字面量,局部變數]運行速度>[陣列,物件成員]

2.內部屬性包含了一個函數被創建的作用域中物件的集合。這個集合稱為作用域鏈。

3.執行函數->建立執行環境->建立活動物件(即函數運行時變數物件)。

所以多次呼叫同一個函數會導致創建多個執行環境。

4.函數執行過程

每遇到一個變數都會經歷一次識別碼解析過程,從哪裡取得或儲存資料。過程搜尋執行環境的作用域鏈。正是這種搜尋過程影響了效能。

5.標識符解析的效能

全域變數總是存在於執行環境作用域的最末端。局部變數是第一順位解析。

經驗法則:如果某個跨作用域的值在函數中被引用一次以上,那麼就把他儲存到局部變數中。

如:

function initUI(){
 var bd=document.body;
 //后面有多次doucument这个全局对象的调用
}
//->优化后
function initUI(){
 var doc=document;
  bd=doc.body;
 //把doucument这个全局对象的引用存储到局部变量doc中
 
}
登入後複製



6.改變作用域鏈

一般來說,一個執行環境的作用域鏈不會改變的。

<1>with可以暫時改變作用域鏈

width用來給物件的所有屬性建立一個變數

function initUI(){
 with(document){
 var bd=body; 
 }
}
登入後複製



當程式碼執行到with時,執行環境的作用域鏈被暫時改變了。一個新的變數物件唄創建,它包含了參數指定物件的所有屬性。 這個物件唄推入作用域鏈的首位,所以這時候所有的局部變數處於的哥第二個作用域鏈物件中,因此存取代價更高了。

<2>try-catch

try語句發生錯誤的時候,執行程序會自動跳到catch。 然後把異常物件推入一個變數物件並置於作用域的首位。

注意:一旦catch子語句執行完畢,作用域鏈就會回到先前的狀態。

7.閉包引發的效能問題

閉包是JavaScript最強大的特性之一。

由於閉包包含了執行了與環境作用域鏈相同物件的引用,函數的活動物件不會被銷毀,造成更多的記憶體開銷。

關注的效能點:經常存取跨作用域的識別碼時,每次存取都會帶來效能損失。

Start:19:41:45 2015-11-21 引用自by Aaron:/content/3493261.html

8.記憶體洩漏

記憶體外洩是指一塊被分配的記憶體既不能使用,又不能回收,直到瀏覽器進程結束。在C++中,因為是手動管理內存,記憶體外洩是經常出現的事情。而現在流行的C#和Java等語言採用了自動垃圾回收方法管理內存,正常使用的情況下幾乎不會發生內存洩露。瀏覽器中也是採用自動垃圾回收方法管理內存,但由於瀏覽器垃圾回收方法有bug,會產生記憶體外洩。

記憶體洩漏的幾種情況

 循環引用

 Javascript閉包

 DOM插入順序

一個DOM物件被一個Javascript物件引用,同時引用同一個或其它的Javascript對象,這個DOM物件可能會引發記憶體洩漏。這個DOM物件的引用將不會在腳本停止的時候被垃圾回收器回收。要破壞循環引用,引用DOM元素的物件或DOM物件的參考需要被賦值為null。

具體的就深入討論了,這裡的總結

 JS的內存洩露,無怪乎就是從DOM中remove了元素,但是依然有變量或者對象引用了該DOM對象。然後內存中無法刪除。使得瀏覽器的記憶體佔用居高不下。這種記憶體佔用,隨著瀏覽器的刷新,會自動釋放。

 而另一個情況,就是循環引用,一個DOM物件和JS物件之間互相引用,這樣造成的情況更嚴重一些,即使刷新,內存也不會減少。這就是嚴格意義上說的記憶體洩漏了。

 以上就是實現JavaScript高效能的資料儲存 的內容,更多相關內容請關注PHP中文網(www.php.cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板