1.javascript中四種基本資料存取位置:字面量,本地變量,數組元素,對象成員。
一般來說:[字面量,局部變量]運作速度>[數組,對象成員]
2.内部屬性包含了一個函數被建立的作用域中對象的集合。這個集合被稱為作用域鍊。
3.執行函數->建立執行環境->建立活動對象(即函數運作時變量對象)。
是以多次調用同一個函數會導緻建立多個執行環境。
4.函數執行過程
每遇到一個變量都會經曆一次辨別符解析過程,從哪裡擷取或存儲資料。該過程搜尋執行環境的作用域鍊。正是這種搜尋過程影響了性能。
5.辨別符解析的性能
全局變量總是存在于執行環境作用域的最末端。局部變量是第一順位解析。
經驗法則:如果某個跨作用域的值在函數中被引用一次以上,那麼就把他存儲到局部變量中。
如:


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>