js造成內存泄漏的幾種情況


1、介紹js的垃圾回收機制

  js的垃圾回收機制就是為了防止內存泄漏的,內存泄漏的含義就是當已經不需要某塊內存時這塊內存還存在着,垃圾回收機制就是間歇的不定期的尋找到不再使用的變量,並釋放掉它們所指向的內存。所以這里又涉及到變量的生命周期,當一個變量的生命周期結束之后它所指向的內存就應該被釋放。JS有兩種變量,全局變量和在函數中產生的局部變量。局部變量的生命周期在函數執行過后就結束了,此時便可將它引用的內存釋放(即垃圾回收),但全局變量生命周期會持續到瀏覽器關閉頁面。所以當我們過多的使用全局變量的時候也會導致內存泄漏的問題

2、主要存在內存泄漏的問題點

  • BOM / DOM對象泄漏
  • scipt中存在對BOM / DOM對象的引用
  • javaScript對象泄漏
  • 閉包函數導致的泄漏

3、主要關注的代碼點

  • DOM中的addEventLisner 函數及派生的事件監聽, 比如Jquery 中的on 函數, vue 組件實例的 $on 函數,第三方庫中的初始化函數
  • BOM對象的事件監聽,比如webSocket的監聽事件
  • 避免不必要的函數引用
  • 如果是要render函數,避免在html標簽中DOM / BOM事件

4、在vue中如何處理內存泄漏的

  • 如果在mounted/created 鈎子中綁定了DOM/BOM 對象中的事件,需要在beforeDestroy 中做對應解綁處理
  • 如果在mounted/created 鈎子中使用了第三方庫初始化,需要在beforeDestroy 中做對應銷毀處理
  • 如果組件中使用了定時器,需要在beforeDestroy 中做對應銷毀處理
  • 模板中不要使用表達式來綁定到特定的處理函數,這個邏輯應該放在處理函數中
  • 如果在mounted/created 鈎子中使用了$on,需要在beforeDestroy 中做對應解綁($off)處理
  • 某些組件在模板中使用 事件綁定可能會出現泄漏,使用$on 替換模板中的綁定

Vue官網講解避免內存泄露https://cn.vuejs.org/v2/cookbook/avoiding-memory-leaks.html

另外,vue  在IE edge瀏覽器下,父子組件的場景,子組件依賴父組件的狀態,子組件控制父組件狀態變化從而反饋給子組件的展示變化,子組件通過v-if模式存在於視圖中,父組件通過狀態控制子組件的v-if狀態變換。子組件控制父組件狀態完成子組件數據填充后,父組件切換子組件的v-if狀態,子組件占用dom結構被清理。此時,子組件存在時的內存占用未被釋放,當父組件再次回切v-if狀態時,子組件重新展示,內存飆升,重復幾次切換后,內存飆升明顯,頁面卡頓。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM