如何避免在我的Firefox插件中出现“TypeError:无法访问死对象”的状态?

时间:2014-07-30 16:16:07

标签: javascript object firefox-addon mozilla

似乎检查null是否有效,但这是一种正确的方法吗?如何正确检查对象是否已死?死对象的定义在哪里?

3 个答案:

答案 0 :(得分:3)

这可能是由于持有僵尸隔间。如果要在变量中存储window,则应使用弱引用,否则会使进程保持活动状态。

很好的阅读:

https://developer.mozilla.org/en-US/docs/Zombie_compartments

这是如何使用弱引用: https://developer.mozilla.org/en-US/docs/Components.utils.getWeakReference

一个死对象,持有对DOM元素(通常)的强大(保持活动)引用,即使在DOM中被销毁之后它仍然存在。

有时检查它是否未定义或null不起作用,我看过一次并且有时使用的技巧是检查parentNode是否存在(所以不是null或未定义)。

答案 1 :(得分:1)

如果您不能使用Blagoh建议的弱引用,那么您可以使用Components.utils.isDeadWrapper()函数进行检查(在Firefox 17中添加但仍未真正记录):

if (Components.utils.isDeadWrapper(element))
  alert("I won't touch that, it's a dead object");

非特权代码并没有真正的方法来识别死对象而不会触发异常。然后,如果一个对象抛出异常,无论你做什么,那么它可能已经死了:

try
{
  String(element);
}
catch (e)
{
  alert("Better not touch that, it's likely a dead object");
}

答案 2 :(得分:0)

死对象意味着一个对象,其父文档已被销毁,并且删除了引用以消除加载项中的内存泄漏。所以你可以检查元素,如:

if( typeof some_element !== 'undefined') {
    //its not dead
}

请参阅Dead Object Reference