鍍金池/ 問答/HTML5  HTML/ 這個(gè)js代碼怎么內(nèi)存泄漏了呢??評(píng)論解析得越詳細(xì)越好

這個(gè)js代碼怎么內(nèi)存泄漏了呢??評(píng)論解析得越詳細(xì)越好

請(qǐng)問,下面這段代碼怎么導(dǎo)致內(nèi)存泄漏了呢???各位大神評(píng)論解析得越詳細(xì)越好。
是循環(huán)引用導(dǎo)致的,還是閉包導(dǎo)致的?

var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
test.onclick = function() {
 test.innerHTML = user.name;
}
// ...后面還有很多其他操作,最后把user對(duì)象釋放掉
user = null; 

還有,就是下面這樣寫為什么可以減少內(nèi)存泄漏呢

var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
(function (name) {
test.onclick = function() {
    test.innerHTML = name;
}
})(user.name);
user = null;
回答
編輯回答
涼汐

JavaScript防止內(nèi)存泄漏最有效的方法:少用對(duì)象、變量的引用賦值,建議了解下數(shù)據(jù)結(jié)構(gòu)方面的知識(shí)。

2017年7月12日 14:18
編輯回答
乖乖噠

你第一段和第二段程序中引用發(fā)生的層級(jí)不同,一個(gè)是在函數(shù)體內(nèi)用匿名函數(shù)完成引用(第一段),一個(gè)是在外層引用傳值(第二段)。

第一段這個(gè)匿名函數(shù)一直綁定到onclick上,所以綁定不解除,引用就不解除,所以即使后面對(duì)象變量已經(jīng)解除綁定了,但對(duì)象實(shí)體并不能被銷毀回收內(nèi)存(那塊實(shí)體內(nèi)存區(qū)域還有引用)。

第二段通過一個(gè)全局匿名即時(shí)調(diào)用函數(shù),把user.name引用的具體字符串內(nèi)容地址給了局部name變量,這個(gè)變量再被onclick引用綁定,而字符串的定義JS中是專門區(qū)域的,實(shí)際上user.name也僅僅是那個(gè)字符串區(qū)域的一個(gè)引用,所以實(shí)際上銷毀user僅僅是對(duì)原來user.name所指區(qū)域進(jìn)行一次減一次引用操作,而具體的區(qū)域并不會(huì)被回收,還可以被onclick引用綁定。

2017年3月19日 11:04
編輯回答
別硬撐

第一個(gè)里面,user一直被那個(gè)onclick指向的匿名函數(shù)引用,所以在user = null之后不會(huì)被回收
第二個(gè)里面,事件處理器里引用的是user.name的值,對(duì)user沒有引用,所以可以在user = null之后被回收

2018年8月15日 00:44