请考虑以下代码:
<script>
function testFunc(){
alert('test')
}
$(function(){
var g = document.getElementById , w = window.testFunc ;
//g
alert(typeof(g));
alert(String(g));
alert(g instanceof Object);
alert(g instanceof Function);
//w
alert(typeof(w));
alert(String(w));
alert(w instanceof Object);
alert(w instanceof Function);
//run it
alert(g('t'));
w();
});
</script>
typeof =&gt; “功能”
String =&gt; “function #funcName#{[native code]}”
instanceof Object =&gt;真正
instanceof Function =&gt;真正
这有点奇怪,我们可以使用w
轻松调用()
,但对于g
,我们必须像这样调用它:
g.call(document,elementId);
说到IE 6,结果完全不同:
//克
typeof =&gt; “对象”
String =&gt; “function getElementById {[native code]}”
instanceof Object =&gt;假
instanceof Function =&gt;假
// w ^
typeof =&gt; “功能”
String =&gt; “function testFunc {alert('test')}”
instanceof Object =&gt;真正
instanceof Function =&gt;真正
更重要的是,我们必须使用'()'直接运行g和w,我们不能像这样调用g:
g.call(document,'t')
这会导致错误。
所以这是我的问题:什么是document.getElementById
,函数或对象,以及g
和w
之间的差异是什么?
答案 0 :(得分:7)
document.getElementById
是一个宿主对象,它是一个函数。它没有在EcmaScript中定义,但是是DOM接口的一部分。
4.3.8主机对象
主机环境提供的对象,以完成ECMAScript的执行环境
由于它支持[[Call]]
运算符,因此它也是一个函数。
主机对象并不总是遵循与本机对象w.r.t相同的规则。 typeof
虽然EcmaScript 5的11.4.3部分已经在某种程度上收紧了规则。
testFunc
是本机对象,特别是本机函数。
4.3.6原生对象
ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义。
注意本规范中定义了标准本机对象。一些本机对象是内置的;其他可能是在执行ECMAScript程序的过程中构建的。
答案 1 :(得分:2)
这是用户代理实现的一个区别,在IE6和1992年之后制作的任何其他浏览器之间可以找到数百个之一。只要最终功能类似于规范,它就会产生很小的差异如何用户代理完成功能(当然,性能除外)
查看此实施差异图表:http://webcoder.info/reference/BrowserFiltering.script.html
那说:不支持IE6。实际上没有(我的意思是 NO )理由担心它,而不是担心AOL5.0本机浏览器。
答案 2 :(得分:1)
如果您的基本问题是跨浏览器兼容性,那么为什么不这样做呢
var g = function(id) { return document.getElementById(g) };
获得一个像getElementById
一样有保障的普通头等功能?
答案 3 :(得分:0)
document.getElementById
是一个功能。 IE6刚出去吃午饭。也许如果你描述了你真正试图解决的问题,人们可以帮助解决这个问题。
答案 4 :(得分:0)
g
是所有浏览器中的本机函数,而w
则不是。typeof
。 IE显示不同的字符串结果,因为浏览器将格式化为字符串不同的函数,这就是为什么你不应该首先将函数转换为字符串。
我认为IE6将object
本机函数显示为document.getElementById
,但它不是任何实例,因为它被浏览器识别并执行为本机函数。
最后并不重要 - 你永远不需要知道{{1}}的类型,特别是在这么老的浏览器中......