1.JavaScript中四種基本資料存取位置:字面量,本地變量,數組元素,物件成員。
一般來說:[字面量,局部變數]運行速度>[陣列,物件成員]
2.內部屬性包含了一個函數被創建的作用域中物件的集合。這個集合稱為作用域鏈。
3.執行函數->建立執行環境->建立活動物件(即函數運行時變數物件)。
所以多次呼叫同一個函數會導致創建多個執行環境。
4.函數執行過程
每遇到一個變數都會經歷一次識別碼解析過程,從哪裡取得或儲存資料。過程搜尋執行環境的作用域鏈。正是這種搜尋過程影響了效能。
5.標識符解析的效能
全域變數總是存在於執行環境作用域的最末端。局部變數是第一順位解析。
經驗法則:如果某個跨作用域的值在函數中被引用一次以上,那麼就把他儲存到局部變數中。
如:
function initUI(){ var bd=document.body; //后面有多次doucument这个全局对象的调用 } //->优化后 function initUI(){ var doc=document; bd=doc.body; //把doucument这个全局对象的引用存储到局部变量doc中 }
6.改變作用域鏈
一般來說,一個執行環境的作用域鏈不會改變的。
f35d6e602fd7d0f0edfa6f7d103c1b57with可以暫時改變作用域鏈
width用來給物件的所有屬性建立一個變數
function initUI(){ with(document){ var bd=body; } }
當程式碼執行到with時,執行環境的作用域鏈被暫時改變了。一個新的變數物件唄創建,它包含了參數指定物件的所有屬性。 這個物件唄推入作用域鏈的首位,所以這時候所有的局部變數處於的哥第二個作用域鏈物件中,因此存取代價更高了。
2cc198a1d5eb0d3eb508d858c9f5cbdbtry-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)!