一、eval是做什么的?
????????在非嚴格模式,可以將json字符串轉換為對象的形式。也可將字符串參數轉化為腳本代碼執行,但只適合在非嚴格模式下。它的功能是將對應的字符串解析成js并執行,應該避免使用js,因為非常消耗性能(2次,一次解析成js,一次執行),簡單來說將字符串參數解析成js代碼并執行,并返回執行結果。但應避免使用,不安全,也耗性能。
二、哪些操作會造成內存泄漏?
先了解什么是內存泄漏?
????????內存泄漏:由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。
1、意外的全局變量
????????js對未聲明變量會在全局最高對象上創建它的引用,(是以屬性存在的,而不是變量),在瀏覽器上就是window對象,如果未聲明的變量緩存大量的數據,它可能只有在頁面被刷新或者被關閉的時候才會釋放內存,這樣就造成了內存意外泄漏。
例如:
2、console.log
作為前端平時使用console.log在控制臺打出相對應的信息可以說是非常常見。但如果沒有去掉console.log可能會存在內存泄漏。因為在代碼運行之后需要在開發工具能查看對象信息,所以傳遞給console.log的對象是不能被垃圾回收。
3、閉包
首先閉包是一個函數A返回一個內聯的函數B,及時A函數執行完函數B也可以訪問函數A里面的變量,這就是一個簡單的閉包。本質上閉包是將函數內部和外部連接起來的一座橋梁。
在my()內部創建的sendName()函數是不會被回收的,因為它被全局變量test引用,處于隨時被調用的狀態。如果向釋放內存可以設置test=null;由于閉包會攜帶包含它的函數的作用域,因此會比其他函數占用更多的內存。過度使用閉包可能會導致內存占用過多。
4、DOM泄漏
基礎的DOM泄漏,當原有的DOM被移除時,子結點引用沒有被移除則無法回收。
5、被遺忘的timers
js中常用的定時器setInterval()、setTimeout().他們都是規定延遲一定的時間執行某個代碼,而其中setInterval()和鏈式setTimeout()在使用完之后如果沒有手動關閉,會一直存在執行占用內存,所以在不用的時候我們可以通過clearInterval()、clearTimeout() 來關閉其對應的定時器,釋放內存。