经常使用Document.getElementById,但更详细的内容请参考。
用你的大脑作为浏览器执行下面的代码两次,分别是IE6和IE9:复制代码代码如下:function test func(){ alert(' test ')} $(function(){ var g=document . getelementbyid,w=window.testfunc//g alert(type of(g));alert(String(g));alert(对象的实例);alert(g instanceof函数);//w alert(type of(w));alert(String(w));alert(对象的实例);alert(w instanceof函数);//执行alert(g(' t ');w();});在标准浏览器(IE9、FF、chrome等。),上面的代码执行的非常一致,结果如下:typeof='function '。复制代码如下:string=' function # funcname # {[native code]} ' object的实例=true function的实例=true。很奇怪,虽然类型是函数,但是我们不能直接用括号来执行函数G,而需要用call来代替。
g.call(document,element id);但如果运行环境是IE6,一切看起来都很奇怪,以下是运行结果(注意加粗部分):复制代码如下://g type of=' Object ' String=' Function getelementbyid {[native code]} ' instance of Object=false instance of Function=false//w type of=' Function ' String=' Function test func { alert(' test ')} ' instance of Object=true instance of Function=true
在IE 6下,G和W都可以只用括号直接执行函数,不需要调用。用下面的方法调用函数G会导致“对象没有这个属性”的错误:g.call(document,eleId)在IE6下,自定义函数testFunc的测试结果没有问题,但是对于G来说就很奇怪了!
既然G是object,为什么可以像函数一样用()直接调用和执行?在标准浏览器中,既然G是函数,为什么不能用()直接执行?其实对于document.getElementById,无论是函数还是对象,即使是jQuery 1.6.2也没有解决这个问题。在IE6中,$。isFunction(g)仍然返回false!以下是jQuery 1.6.2的jQuery.isFunction的相关源代码:
复制代码如下:class 2 type={ };//填充class2type map jQuery.each(“布尔数字字符串函数数组日期RegExp对象”)。split('),function(i,name){ class 2 type['[object ' name ']']=name . tolowercase();});type:function(obj){ return obj==null?string(obj):class 2 type[object . prototype . tostring . call(obj)]| | ' object ';},is function:function(obj){ return jquery . type(obj)===' function ';}
所以我在StackOverflow上问了这个问题。好在确实有很多牛人,很快就得到回复。最后我简单总结一下,供大家参考:document.getElementById最初被定义为HTMLDocument (HTML DOM)接口的成员,但在后来的二级DOM中被移到了Document (XML DOM)接口中。Document.getElementById属于host object,host object是一个函数,但它不是在ECMAScript中定义的,而是DOM接口的一部分。支持[[调用]](内部属性?)主机对象的typeof的返回值是function。请记住,主机对象并不总是遵循本机对象的相关规则,例如typeof。对于testFunc,是原生对象,更确切的说是原生函数。以下是EcmaScript 5对typeof运算符返回结果的分类:
Type of val
Result
不明确的
"undefined"
空
"object"
布尔代数学体系的
"boolean"
数字
"number"
线
"string"
对象(本机并且不实现[[Call]])
"object"
对象(本机或宿主,并且确实实现[[Call]])
"function"
对象(宿主并且不实现[[调用]])
实现定义的except可能不是"undefined"、"boolean"、"number'或 "string".所以如果要用$,替换document.getElementById,需要这样做:复制代码如下:var $=function(id){ return document . getelementbyid(g)};但即使有了上面的解释,我对宿主对象和原生对象又有了新的怀疑。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。