考虑以下代码:
<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)
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
,功能或对象,什么是差异性之探源g
和w
?
document.getElementById
是一个宿主对象,它是一个函数.它不是在EcmaScript中定义的,而是DOM接口的一部分.
4.3.8主机对象
主机环境提供的对象,以完成ECMAScript的执行环境
由于它支持[[Call]]
操作员,因此它也是一种功能.
主机对象并不总是遵循与本机对象相同的规则,typeof
尽管EcmaScript 5的第11.4.3节稍微收紧了规则.
testFunc
是本机对象,特别是本机函数.
4.3.6原生对象
ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义.
注意本规范中定义了标准本机对象.一些本机对象是内置的; 其他可能是在执行ECMAScript程序的过程中构建的.