作者chieh0919 (chieh)
看板Ajax
标题[问题] 关於Closure Garbage Collection疑问
时间Thu Jul 31 22:40:20 2014
大家好, 最近在看下面的Closure和Google JS Style Guide的Closure时
有一些疑问想请教大家
http://jibbering.com/faq/notes/closures/
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml#Closures
Google Guide里Closure不好的范例中说,
在函式内设定的onclick里虽然没有用到element,
但形成的Closure Scope chain中, 依然会refer到这个element
那麽下面的程式中, obj.fn内只有用到a, 用侦错在debugger处停下时,
在监看式中看b会是undefined, 这样b是否依然保持着被refer,
存在於obj.fn上层的Scope chain?
或者他已经是处於可以(已)被回收的状态呢?
(function () {
var a = 1,
b = 2;
obj.fn = function () {
debugger;
var x = a + 3;
};
} ());
另外, 在jQuery物件使用上, 在$elem.remove()後,
jQuery物件的数字key依然保持DOM Element的关联
如下面的程式中, 创建了一个jQuery物件并加入到body,
随後马上remove, 但因为被关联於$elem变数, 所以随时可以被append回DOM,
这样是否表示在$elem设为null前, $elem下的DOM Element都不会被回收?
var $elem = $('<div>').appendTo('body');
$elem.remove();
...
$elem.appendTo('body);
另外上面的疑问套用在Closure情境中时,
(function () {
var $elem = $('<div>').appendTo('body');
$elem.on('click', function () {
//假设这边不是用$(this)取得$elem,
//而是直接使用$elem变数的话,
//是否会发生Google Guide中Closure里所说的循环参考的情况,
//进而造成$elem无法被回收?
});
} ());
以上是小弟在看这2份文件的Closure时产生的疑问,
请大家帮小弟解答, 谢谢^^
--
我先看一下你的报告 医生~我得什麽病阿 ◢◤ 天阿~这没有药能医阿..
◢██◣ ◤
◢██◣ ◤ ◢◤◢██◣ ◤
(碰!晕倒)
█ ◥▌ ◤◥◥█ ψQSWEET ◢◤ █ ◥▌
◤□︵□▌ ● ● █ ◢◤ ◤□︵□▌ ╱ 公主病没药医阿~
◣ ︵◢ ◣︵ █▌ ◢◤ ◣ □◢ ╱ ◤
◢ ▋ + ◤  ̄ ̄◣v◣ ◤ ◢◤ ◢ ▋ + ◤
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.132.181
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Ajax/M.1406817629.A.B06.html
※ 编辑: chieh0919 (114.44.132.181), 07/31/2014 22:45:37
1F:推 sean2449:你第二个就是普通closure吧可以被回收 08/02 09:33
2F:→ sean2449:Google的是假如我呼叫foo( myEle );然後myEle = null; 08/02 09:35
3F:→ sean2449:myEle指到的物件不会被回收因为他被foo里的element指到 08/02 09:40
4F:→ sean2449:第一个的话b不被用到,所以function执行完就回收 08/02 09:41
5F:→ sean2449:第一个不太确定就是或是跟browser有关? 08/02 10:03