在mozilla docs中说:
initWithCallback():初始化一个定时器,在给定的毫秒间隔后触发。这个版本需要一个函数来调用和一个闭包来传递给那个函数。
在此代码示例中:
setupTimer: function() {
var waitPeriod = getNewWaitPeriod();
myTimer.initWithCallback({
notify: function(t) {
foo();
setupTimer();
}
},
waitPeriod,
Components.interfaces.nsITimer.TYPE_ONE_SHOT);
}
传递给函数的闭包实际包含了多少。闭包是否保留整个堆栈的副本?此代码示例是否存在堆栈溢出或永久增加内存使用的风险?
答案 0 :(得分:0)
理论上,闭包会保留闭包范围内的所有内容(因此在本例中,setupTimer中的局部变量加上setupTimer本身关闭的任何变量)。请注意,这与callstack不同:JS中的闭包范围是词法,而不是动态,所以无论你如何到达函数,只看函数的来源是什么样的。
实际上,JS引擎会大量优化闭包,以加快对闭包中裸字的访问速度,因此闭包实际保持活动的一组内容可能比我上面描述的理论集小。但我不会依赖于此。