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

问题描述 投票:0回答:3

看起来检查

null
是有效的,但这是正确的方法吗?如何正确检查对象没有死?死对象的定义在哪里?

javascript object firefox-addon mozilla
3个回答
3
投票

这可能是由于持有僵尸隔间。如果您将

window
存储在变量中,则应该使用弱引用,否则它会使进程保持活动状态。

在这里读得很好:

MDN 关于僵尸隔间的文章

这是如何使用弱引用:

MDN 文档

Components.utils.getWeakReference

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

有时检查它是否未定义或为 null 不起作用,我曾经见过并且有时使用的一个技巧是检查 ParentNode 是否存在(因此不是 null 或未定义)。


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");
}

-1
投票

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

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

参见 死对象参考

© www.soinside.com 2019 - 2024. All rights reserved.