什么是document.getElementById?

sim*_* xu 9 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 Function);
    //w
    alert(typeof(w));
    alert(String(w));
    alert(w instanceof Object);
    alert(w instanceof Function);
    //run it
    alert(g('t'));
            w();

});
</script>
Run Code Online (Sandbox Code Playgroud)

现代浏览器(chrome,IE 9,Firefox)中的代码行为相同.结果是:

typeof =>"function"
String =>"function #funcName#{[native code]}"
instanceof Object => true
instanceof Function => true
它有点奇怪,我们可以w通过使用轻松调用(),但是g,我们必须调用它是这样的:

g.call(document,elementId);
Run Code Online (Sandbox Code Playgroud)

说到IE 6,结果完全不同:


// g
typeof =>"object"
String =>"function getElementById {[native code]}"
instanceof Object => false
instanceof Function => false
// w
typeof =>"function"
String =>"function testFunc {alert( 'test')}"
instanceof Object => true
instanceof Function => true
更重要的是,我们必须使用'()'直接运行g和w,我们不能像这样调用g:

g.call(document,'t')
Run Code Online (Sandbox Code Playgroud)

这会导致错误.因此,这里是我的问题:是什么document.getElementById,功能或对象,什么是差异性之探源gw

Mik*_*uel 7

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

4.3.8主机对象

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

由于它支持[[Call]]操作员,因此它也是一种功能.

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

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

4.3.6原生对象

ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义.

注意本规范中定义了标准本机对象.一些本机对象是内置的; 其他可能是在执行ECMAScript程序的过程中构建的.