javascript中的匿名函数

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

我将一个匿名函数A作为参数传递给另一个函数B。即使在我调用B.destroy之后,函数A仍然存在并被执行,它甚至作为一个活动的匿名作用域传递给它自己。我通过调试器发现了这种意外行为。下面是代码

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