javascript中的匿名函数
我将一个匿名函数A作为参数传递给另一个函数B。即使在我调用B.destroy之后,函数A仍然存在并被执行,它甚至作为一个活动的匿名作用域传递给它自己。我通过调试器发现了这种意外行为。下面是代码javascript中的匿名函数,javascript,jquery,firefox,Javascript,Jquery,Firefox,我将一个匿名函数A作为参数传递给另一个函数B。即使在我调用B.destroy之后,函数A仍然存在并被执行,它甚至作为一个活动的匿名作用域传递给它自己。我通过调试器发现了这种意外行为。下面是代码 var builder.record.verifyExplorer = new builder.VerifyExplorer( window.bridge.getRecordingWindow(), builder.getScript().seleniumVersion, fun
var builder.record.verifyExplorer = new builder.VerifyExplorer(
window.bridge.getRecordingWindow(),
builder.getScript().seleniumVersion,
function(step) {
builder.getScript().addStep(step);
builder.stepdisplay.update();
// Don't immediately stop: this would cause the listener that prevents the click from
// actually activating the selected element to be detached prematurely.
setTimeout(function() { builder.record.stopVerifyExploring(); }, 1);
window.bridge.focusRecorderWindow();
}
);
我通过将stopVerifyExploring定义为
builder.record.stopVerifyExploring = function() {
builder.record.verifyExploring = false;
builder.record.verifyExplorer.destroy();
builder.record.verifyExplorer = null;
builder.record.continueRecording();
};
即使在verifyExplorer.destroy被调用之后,函数(步骤)仍然存在于匿名范围内,并执行所有不需要的操作
我有这种奇怪的行为
jQuery(frame.document).bind(l, {}, ae.listeners[l], true);
与
在verifyExplorer中。我如何更改上述代码片段导致意外行为
所有这些都是我修复开源项目中一个bug的一部分。同样相关的该行为一点也不意外,您没有做任何事情来取消计时器 如果要取消计时器,请保存
setTimeout
的返回值,然后在以后/如果要取消计时器时将该值传递到cleartimout
发生了什么事:
函数和对象只要有引用就存在。当您这样做时:
setTimeout(function() { builder.record.stopVerifyExploring(); }, 1);
…您正在浏览器的计时器处理程序中保存对该匿名函数的引用。该函数引用了创建它的上下文(以及所有包含它的上下文)。因此,即使您执行了verifyExplorer=null
,这对verifyExplorer
对象用来引用的任何内容以及引用该对象的任何内容都没有影响。它只是从特定变量中清除对该对象的引用。如果存在其他未完成的引用(并且存在),则对象将保留在内存中
在这种情况下,如果唯一未完成的引用是您提供给setTimeout
的函数,则清除超时(可能在destroy
中)将释放浏览器对该函数的引用,从而释放该函数对其关闭的上下文的引用,这些东西可以被垃圾收集
更多(在我的博客上):这种行为一点也不意外,你没有做任何事情来取消计时器 如果要取消计时器,请保存
setTimeout
的返回值,然后在以后/如果要取消计时器时将该值传递到cleartimout
发生了什么事:
函数和对象只要有引用就存在。当您这样做时:
setTimeout(function() { builder.record.stopVerifyExploring(); }, 1);
…您正在浏览器的计时器处理程序中保存对该匿名函数的引用。该函数引用了创建它的上下文(以及所有包含它的上下文)。因此,即使您执行了verifyExplorer=null
,这对verifyExplorer
对象用来引用的任何内容以及引用该对象的任何内容都没有影响。它只是从特定变量中清除对该对象的引用。如果存在其他未完成的引用(并且存在),则对象将保留在内存中
在这种情况下,如果唯一未完成的引用是您提供给setTimeout
的函数,则清除超时(可能在destroy
中)将释放浏览器对该函数的引用,从而释放该函数对其关闭的上下文的引用,这些东西可以被垃圾收集
更多(在我的博客上):这种行为一点也不意外,你没有做任何事情来取消计时器 如果要取消计时器,请保存
setTimeout
的返回值,然后在以后/如果要取消计时器时将该值传递到cleartimout
发生了什么事:
函数和对象只要有引用就存在。当您这样做时:
setTimeout(function() { builder.record.stopVerifyExploring(); }, 1);
…您正在浏览器的计时器处理程序中保存对该匿名函数的引用。该函数引用了创建它的上下文(以及所有包含它的上下文)。因此,即使您执行了verifyExplorer=null
,这对verifyExplorer
对象用来引用的任何内容以及引用该对象的任何内容都没有影响。它只是从特定变量中清除对该对象的引用。如果存在其他未完成的引用(并且存在),则对象将保留在内存中
在这种情况下,如果唯一未完成的引用是您提供给setTimeout
的函数,则清除超时(可能在destroy
中)将释放浏览器对该函数的引用,从而释放该函数对其关闭的上下文的引用,这些东西可以被垃圾收集
更多(在我的博客上):这种行为一点也不意外,你没有做任何事情来取消计时器 如果要取消计时器,请保存
setTimeout
的返回值,然后在以后/如果要取消计时器时将该值传递到cleartimout
发生了什么事:
函数和对象只要有引用就存在。当您这样做时:
setTimeout(function() { builder.record.stopVerifyExploring(); }, 1);
…您正在浏览器的计时器处理程序中保存对该匿名函数的引用。该函数引用了创建它的上下文(以及所有包含它的上下文)。因此,即使您执行了verifyExplorer=null
,这对verifyExplorer
对象用来引用的任何内容以及引用该对象的任何内容都没有影响。它只是从特定变量中清除对该对象的引用。如果存在其他未完成的引用(并且存在),则对象将保留在内存中
在这种情况下,如果唯一未完成的引用是您提供给setTimeout
的函数,则清除超时(可能在destroy
中)将释放b