var div = document.createElement("div");div.onclick = function(){
doSomething();
}; // The div has a reference to the event handler via its 'onclick' property// The handler also has a reference to the div since the 'div' variable can be accessed within the function scope// This cycle will cause both objects not to be garbage-collected and thus a memory leak.这里说的, 函数里有一个对 div 的引用, 可是在哪, 是 this 么?这是语言设计的失误么?
2 回答
月关宝盒
TA贡献1772条经验 获得超5个赞
那几句英文大概是这个意思:
1. 名叫 div
的变量有一个对 handler
的引用(因为 handler
是它的一个属性)
2. handler
也同样有一个对 div
的引用(因为 div
处于它的作用域内。这是js闭包的特性,函数内的代码可以引用函数外的变量)
3. 这就造成了循环引用,最后两个变量都不会被销毁,成了内存泄露
按照这个说法,像下面这样写代码就不会出现这种内存泄露了。
因为 div 变量不再处于 handler 函数的作用域之中。
var handler = function(){ dosomething(); };(function(){ var div = document.createElement("div"); div.onclick = handler;})();
不过我也是猜想的,没怎么研究过内存泄露的问题。
叮当猫咪
TA贡献1776条经验 获得超12个赞
啥叫内存泄露,这几句代码绝对不会引起内存泄露。
只是有内存泄露的风险,只是在内存里常驻了,其实js里很容易写出造成变量在内存里常驻的代码什么的。写多了都没感觉了,最多多占用几B几KB。内存泄露是指不断循环引用,造成内存狂飙的那种代码。
写NodeJS的时候就对内存泄露有更多体会了,因为你一个方法可能会在瞬间被无数个请求激活调用,如果代码写的不好很容易就泄露了。不过V8也远比我们想象的聪明,它会自动帮我们处理掉一些情况,具体就木有研究过了。
说来说去,其实我也不是很懂,纯扯皮
添加回答
举报
0/150
提交
取消