Javascript 什么是document.getElementById?

Javascript 什么是document.getElementById?,javascript,Javascript,考虑以下代码: <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 Funct

考虑以下代码:

<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>
对于IE 6,结果完全不同:


//g
typeof=>“对象”
String=>“函数getElementById{[本机代码]}”
instanceof Object=>false
instanceof Function=>false
//w
typeof=>“函数”
String=>“函数testFunc{alert('test')}”
对象实例=>true
instanceof Function=>true
此外,我们必须使用“()”直接运行g和w,不能这样调用g:

g.call(document,elementId);
g.call(document,'t')
这将导致错误。
所以我的问题是:什么是
文档。getElementById
,函数还是对象,以及
g
w
之间的区别是什么?

文档。getElementById
是一个函数。IE6刚出去吃午饭。也许,如果您描述了您真正想要解决的问题,人们可以提供帮助。

document.getElementById
是一个宿主对象,也是一个函数。它不是在EcmaScript中定义的,而是DOM接口的一部分

宿主对象

由主机环境提供的对象,以完成ECMAScript的执行环境

因为它支持
[[Call]]
操作符,所以它也是一个函数

宿主对象并不总是遵循与本机对象w.r.t.
typeof
相同的规则,尽管EcmaScript 5的一节稍微收紧了规则

testFunc
是本机对象,特别是本机函数

4.3.6本机对象

对象,其语义完全由本规范而不是主机环境定义

注:本规范中定义了标准本机对象。一些本机对象是内置的;其他的可以在ECMAScript程序的执行过程中构造


g
在所有浏览器中都是本机函数,而
w
则不是。IE显示不同的字符串结果,因为浏览器将函数的格式设置为不同的字符串,这就是为什么您不应该首先将函数转换为字符串

我假设IE6将本机函数的
类型显示为
对象
,但它不是任何东西的实例,因为它被浏览器识别并作为本机函数执行


但最终这并不重要-您永远不需要知道
document.getElementById的类型,尤其是在这样一个旧的浏览器中…

如果您的根本问题是跨浏览器兼容性,为什么不这样做呢

 var g = function(id) { return document.getElementById(g) };

要获得一个像getElementById一样工作的保证普通一级函数,这是用户代理实现的一个不同点,IE6和1992年以后的任何其他浏览器之间都有数百个。只要最终功能与规范相似,用户代理完成功能的方式就没有什么区别(当然,性能除外)

查看此实施差异图表:


也就是说:不要支持IE6。与担心AOL5.0本机浏览器相比,真的没有(我的意思是没有)理由担心它。

这里的答案是停止支持IE6,让它消失=d DOM接口的行为不必像本机JavaScript函数/对象,甚至不必像本机JavaScript函数/对象那样。@Tejs:所有人都赞成说是:是!IE7上也报告了IE6的行为,其中有
getElementsByTagName