Del*_*iaz 9 html javascript tags object
当我使用chrome devtools时,我很奇怪.但似乎typeof <object>是一个"功能".
我没有找到任何解释或参考.
这是一个简单的例子:https
://jsfiddle.net/fez34zbf/
HTML:
<object></object>
<video></video>
Run Code Online (Sandbox Code Playgroud)
JS:
console.log(typeof document.querySelector('object'));
console.log(typeof document.querySelector('video'));
Run Code Online (Sandbox Code Playgroud)
控制台结果将是:
function
object
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
正如已经提到的,typeof 必须返回"function"所有具有[[Call]]内部方法的对象。(spec)。所以有趣的部分是,HTMLObjectElement出于某种原因, 的实例有一个[[Call]]内部方法。
Firefox和chrome都有这方面的错误报告。虽然 chrome 问题上的 Firefox 问题没有回复,但有一个解释[[Call]]添加到HTMLObjectElement
对,那是正确的。SetCallAsFunctionHandler() 使对象可以根据 EcmaScript 进行调用,因此我们必须为 typeof 返回“function”。
SetCallAsFunctionHandler似乎是 v8 中的一些实现细节。根据这个问题,chrome 曾经报告object为typeof的实例HTMLObjectElement,但他们将其更改为与 firefox 兼容。
现在为什么有一个[[Call]]内部方法HTMLObjectElement?由于这个 stackoverflow 答案暗示这似乎被某些插件使用。HTMLObjectElement由插件(例如 flash )使用。其中一些插件可能除了使用此功能的输入之外。
查看chromium 的源 代码,似乎有一些代码确实处理了一些遗留回调(V8HTMLEmbedElement.cpp和V8HTMLPlugInElementCustom.cpp)。
在这张firefox 票证中也证实了这一点
为什么 Embed/Object 元素首先是可调用的?[...] 据任何人所知,因为某些插件在您调用它们时会执行一些操作,并且没有人愿意出于兼容性原因而破坏它......
我没有找到任何定义此行为的规范。html5 规范提到了 遗留调用者操作,但没有准确定义它是如何工作的
总结一下:typeof document.createElement('object')是"function"因为它有一个[[Call]]内部方法。[[Call]]由于遗留原因,它有一个内部方法。
如果你在chrome中执行这段代码
(function(){
'use strict';
return document.createElement('object')()
})()
Run Code Online (Sandbox Code Playgroud)
你得到undefined一个返回值。如果你在 Firefox 中执行它,你会得到一个异常
组件不可用”nsresult:“0x80040111(NS_ERROR_NOT_AVAILABLE)”位置:“JS框架::调试器评估代码:::第1行”数据:否
有趣的document.createElement('object') instanceof Function是,因此上不存在false任何方法。Function.prototypeHTMLObjectElement
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |