一盛撑、eval是做什么的?
????????在非嚴(yán)格模式捧搞,可以將json字符串轉(zhuǎn)換為對(duì)象的形式撵彻。也可將字符串參數(shù)轉(zhuǎn)化為腳本代碼執(zhí)行,但只適合在非嚴(yán)格模式下实牡。它的功能是將對(duì)應(yīng)的字符串解析成js并執(zhí)行,應(yīng)該避免使用js轴合,因?yàn)榉浅O男阅埽?次创坞,一次解析成js,一次執(zhí)行)受葛,簡單來說將字符串參數(shù)解析成js代碼并執(zhí)行题涨,并返回執(zhí)行結(jié)果。但應(yīng)避免使用总滩,不安全纲堵,也耗性能。
二闰渔、哪些操作會(huì)造成內(nèi)存泄漏席函?
先了解什么是內(nèi)存泄漏?
????????內(nèi)存泄漏:由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存冈涧。內(nèi)存泄漏并非指內(nèi)存在物理上的消失茂附,而是應(yīng)用程序分配某段內(nèi)存后正蛙,由于設(shè)計(jì)錯(cuò)誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對(duì)該段內(nèi)存的控制营曼,從而造成了內(nèi)存的浪費(fèi)乒验。
1、意外的全局變量
????????js對(duì)未聲明變量會(huì)在全局最高對(duì)象上創(chuàng)建它的引用蒂阱,(是以屬性存在的锻全,而不是變量),在瀏覽器上就是window對(duì)象录煤,如果未聲明的變量緩存大量的數(shù)據(jù)鳄厌,它可能只有在頁面被刷新或者被關(guān)閉的時(shí)候才會(huì)釋放內(nèi)存,這樣就造成了內(nèi)存意外泄漏辐赞。
例如:
2部翘、console.log
作為前端平時(shí)使用console.log在控制臺(tái)打出相對(duì)應(yīng)的信息可以說是非常常見。但如果沒有去掉console.log可能會(huì)存在內(nèi)存泄漏响委。因?yàn)樵诖a運(yùn)行之后需要在開發(fā)工具能查看對(duì)象信息新思,所以傳遞給console.log的對(duì)象是不能被垃圾回收。
3赘风、閉包
首先閉包是一個(gè)函數(shù)A返回一個(gè)內(nèi)聯(lián)的函數(shù)B,及時(shí)A函數(shù)執(zhí)行完函數(shù)B也可以訪問函數(shù)A里面的變量夹囚,這就是一個(gè)簡單的閉包。本質(zhì)上閉包是將函數(shù)內(nèi)部和外部連接起來的一座橋梁邀窃。
在my()內(nèi)部創(chuàng)建的sendName()函數(shù)是不會(huì)被回收的荸哟,因?yàn)樗蝗肿兞縯est引用,處于隨時(shí)被調(diào)用的狀態(tài)瞬捕。如果向釋放內(nèi)存可以設(shè)置test=null;由于閉包會(huì)攜帶包含它的函數(shù)的作用域鞍历,因此會(huì)比其他函數(shù)占用更多的內(nèi)存。過度使用閉包可能會(huì)導(dǎo)致內(nèi)存占用過多肪虎。
4劣砍、DOM泄漏
基礎(chǔ)的DOM泄漏,當(dāng)原有的DOM被移除時(shí)扇救,子結(jié)點(diǎn)引用沒有被移除則無法回收刑枝。
5、被遺忘的timers
js中常用的定時(shí)器setInterval()迅腔、setTimeout().他們都是規(guī)定延遲一定的時(shí)間執(zhí)行某個(gè)代碼装畅,而其中setInterval()和鏈?zhǔn)絪etTimeout()在使用完之后如果沒有手動(dòng)關(guān)閉,會(huì)一直存在執(zhí)行占用內(nèi)存沧烈,所以在不用的時(shí)候我們可以通過clearInterval()掠兄、clearTimeout() 來關(guān)閉其對(duì)應(yīng)的定時(shí)器,釋放內(nèi)存。