【发布时间】:2010-02-07 15:37:46
【问题描述】:
当我在 Firefox 中遇到一个有趣的现象时,我正在迭代 document 的属性,document 声称支持属性 domConfig 尽管 MDC says it isn't implemented 但当我尝试检索该属性时,我得到了一个异常:
错误:未捕获的异常:[Exception...“组件返回失败代码:0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOM3Document.domConfig]”nsresult:“0x80004001 (NS_ERROR_NOT_IMPLEMENTED)”位置:“JS 框架 :: javascript:alert(typeof( document.domConfig)) :: :: line 1" data: no]
以下显示了行为,Chrome 和 IE 都是一致的(我没有检查过 Opera)说 domConfig 不是窗口的属性,但 Firefox 声称它是但无法检索它(复制粘贴到URL 字段,因为我无法通过 markdown 提供链接)。
/* true in FF, false in other browsers */
javascript:alert("domConfig" in document)
/* exception in FF, 'undefined' in other browsers */
javascript:alert(typeof(document.domConfig))
这是怎么回事?
【问题讨论】:
-
对我来说似乎很清楚:文档说它没有实现,当你尝试访问它时,你肯定会得到一个“NOT_IMPLEMENTED”异常。像“文档”这样的“原生”对象是进入浏览器内部的入口,因此 C++ 对象向 Javascript 公开一个触发异常的属性这一事实仅意味着它作为存根存在。这对您有何影响?
-
@Pointy,那么为什么它会显示为属性?迭代属性时我必须跳过它。
-
看来我猜是因为 Mozilla 开发人员把它暴露在那里。我不完全确定 Javascript C++ 边界是如何工作的,但我猜测有一个函数被调用,它抛出了 NOT_IMPLEMENTED 异常。你总是可以将你的“属性嗅探器”包装在一个 try/catch 块中,然后忽略这样的异常。
-
不过,@Motti 还是有道理的。为什么在尝试获取其类型时会抛出异常?对我来说听起来很愚蠢。它迫使开发人员为未知类型的异常做准备,并默默地丢弃它们——这根本不是好的做法。
-
记住男孩和女孩,定义!= 实施。请参阅 Nickolay 的回答。
标签: javascript firefox exception dom