天天看點

高性能JavaScript--資料存儲(簡要學習筆記二)

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

一般來說:[字面量,局部變量]運作速度>[數組,對象成員]

2.内部屬性包含了一個函數被建立的作用域中對象的集合。這個集合被稱為作用域鍊。

3.執行函數->建立執行環境->建立活動對象(即函數運作時變量對象)。

是以多次調用同一個函數會導緻建立多個執行環境。

4.函數執行過程

每遇到一個變量都會經曆一次辨別符解析過程,從哪裡擷取或存儲資料。該過程搜尋執行環境的作用域鍊。正是這種搜尋過程影響了性能。

5.辨別符解析的性能

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

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

如:

高性能JavaScript--資料存儲(簡要學習筆記二)
高性能JavaScript--資料存儲(簡要學習筆記二)

6.改變作用域鍊

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

<1>with可以臨時改變作用域鍊

width用來給對象的所有屬性建立一個變量

當代碼執行到with時,執行環境的作用域鍊被臨時改變了。一個新的變量對象呗建立,它包含了參數指定對象的所有屬性。這個對象呗推入作用域鍊的首位,是以這時候所有的局部變量處于的哥第二個作用域鍊對象中,是以通路代價更高了。

<2>try-catch

try語句發生錯誤的時候,執行過程會自動跳轉到catch中。然後把異常對象推入一個變量對象并置于作用域的首位。

注意:一旦catch子語句執行完畢,作用域鍊就會傳回到之前的狀态。

7.閉包引發的性能問題

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

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

關注的性能點:頻繁通路跨作用域的辨別符時,每次通路都會帶來性能損失。

8.記憶體洩露

記憶體洩露是指一塊被配置設定的記憶體既不能使用,又不能回收,直到浏覽器程序結束。在c++中,因為是手動管理記憶體,記憶體洩露是經常出現的事情。而現在流行的c#和java等語言采用了自動垃圾回收方法管理記憶體,正常使用的情況下幾乎不會發生記憶體洩露。浏覽器中也是采用自動垃圾回收方法管理記憶體,但由于浏覽器垃圾回收方法有bug,會産生記憶體洩露。 

記憶體洩露的幾種情況

循環引用

javascript閉包

dom插入順序

一個dom對象被一個javascript對象引用,與此同時又引用同一個或其它的javascript對象,這個dom對象可能會引發記憶體洩漏。這個dom對象的引用将不會在腳本停止的時候被垃圾回收器回收。要想破壞循環引用,引用dom元素的對象或dom對象的引用需要被指派為null。

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

js的記憶體洩露,無怪乎就是從dom中remove了元素,但是依然有變量或者對象引用了該dom對象。然後記憶體中無法删除。使得浏覽器的記憶體占用居高不下。這種記憶體占用,随着浏覽器的重新整理,會自動釋放。

而另外一種情況,就是循環引用,一個dom對象和js對象之間互相引用,這樣造成的情況更嚴重一些,即使重新整理,記憶體也不會減少。這就是嚴格意義上說的記憶體洩露了。

end 2015-11-21 19:45:01

轉載:<b>http://www.cnblogs.com/zqzjs/p/4915678.html</b>