Eri*_*ton 7 javascript safari xmlhttprequest
我想知道XMLHttpRequestJavaScript中标准类型的对象是什么.根据引擎的不同,我发现了不同的结果.
在Firefox和Chrome中:
typeof XMLHttpRequest //=> "function"
Run Code Online (Sandbox Code Playgroud)
在Safari中:
typeof XMLHttpRequest //=> "object"
Run Code Online (Sandbox Code Playgroud)
W3C规范使用interface关键字来定义XMLHttpRequest,这在实践中没有使用:
[Constructor(optional XMLHttpRequestOptions options)]
interface XMLHttpRequest : XMLHttpRequestEventTarget {
// ...
}
Run Code Online (Sandbox Code Playgroud)
该MDN定义指出:
XMLHttpRequest是一个JavaScript对象......
但Firefox回归"function",所以这个词至少含糊不清.该定义还指出:
它现在正在W3C中进行标准化.
我在这里和那里看了一下,但没有明确的答案 ™.有没有?
除此之外,还有一些额外的背景
我刚修复了这段代码中的错误:
if (typeof XMLHttpRequest === "function") {
// do something
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,只在Safari 7中发生了这个错误(没有对其他版本进行测试).该代码在Firefox和Chrome中运行良好.修复是:
if (typeof XMLHttpRequest !== "undefined") {
// do something
}
Run Code Online (Sandbox Code Playgroud)
问题来自于假设typeof XMLHttpRequest各地都一样......
根据 ECMAScript 5 和 Web IDL 规范,Safari 在这里似乎是错误的。typeof XMLHttpRequest应该返回"function"。
WebIDL规范说:
如果使用扩展属性声明接口
[Constructor],则可以将接口对象作为函数调用以创建实现该接口的对象。...
接口对象的内部
[[Call]]方法的行为如下......
同时,ESCAScript 5 规范中的规范typeof有一个返回值表,其中包含以下条目:
对象(本机或主机并执行
[[Call]]):"function"对象(主机且不实现
[[Call]]):由实现定义,但可能不是"undefined"、"boolean"、"number"或"string"。
从这个表中,我们可以看到任何实现的对象(本机或主机)[[Call]]都需要导致typeofyield "function"。WebIDL 规范需要[Constructor]接口对象来实现[[Call]],因此它们应该产生"function"。
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |