猿问

JavaScript函数混叠似乎不起作用

JavaScript函数混叠似乎不起作用

我只是在看书这个问题我想尝试一下别名方法,而不是函数包装方法,但我似乎无法让它在Firefox 3、3.5beta4或GoogleChrome中工作,无论是在它们的调试窗口中还是在测试网页中。

萤火虫:

>>> window.myAlias = document.getElementByIdfunction()>>> myAlias('item1')>>> window.myAlias('item1')
>>> document.getElementById('item1')<div id="item1">

如果我把它放在网页中,调用myalias会给出以下错误:

uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c 
(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: file:///[...snip...]/test.html :: <TOP_LEVEL> :: line 7" data: no]

Chrome(插入>是为了清晰起见):

>>> window.myAlias = document.getElementByIdfunction getElementById() { [native code] }>>> window.myAlias('item1')
TypeError: Illegal invocation>>> document.getElementById('item1')<div id=?"item1">?

在测试页面中,我得到了同样的“非法调用”。

我做错什么了吗?还有人能复制这个吗?

而且,奇怪的是,我刚刚尝试了,它在IE8中工作。


神不在的星期二
浏览 423回答 3
3回答

慕婉清6462132

必须将该方法绑定到Document对象。看:>>>&nbsp;$&nbsp;=&nbsp;document.getElementById getElementById()>>>&nbsp;$('bn_home')[Exception...&nbsp;"Cannot&nbsp;modify&nbsp;properties&nbsp;of&nbsp;a&nbsp;WrappedNative"&nbsp;...&nbsp;anonymous&nbsp;::&nbsp;line&nbsp;72&nbsp;data:&nbsp;no] >>>&nbsp;$.call(document,&nbsp;'bn_home')<body&nbsp;id="bn_home"&nbsp;onload="init();">在执行简单别名时,函数是在全局对象上调用的,而不是在文档对象上调用的。使用一种称为闭包的技术来修复这个问题:function&nbsp;makeAlias(object,&nbsp;name)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fn&nbsp;=&nbsp;object&nbsp;?&nbsp;object[name]&nbsp;:&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(typeof&nbsp;fn&nbsp;==&nbsp;'undefined')&nbsp;return&nbsp;function&nbsp;()&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fn.apply(object,&nbsp;arguments) &nbsp;&nbsp;&nbsp;&nbsp;}}$&nbsp;=&nbsp;makeAlias(document,&nbsp;'getElementById');>>>&nbsp;$('bn_home')<body&nbsp;id="bn_home"&nbsp;onload="init();">这样,您就不会丢失对原始对象的引用。在2012年,新的bind方法,该方法允许我们以更合理的方式执行此操作:>>>&nbsp;$&nbsp;=&nbsp;document.getElementById.bind(document)>>>&nbsp;$('bn_home')<body&nbsp;id="bn_home"&nbsp;onload="init();">

喵喵时光机

这是一个简短的回答。下面是函数的副本(引用)。问题是,现在该函数位于window对象时,当它被设计为驻留在document对象。window.myAlias&nbsp;=&nbsp;document.getElementById可供选择的方案如下使用包装器(Fabien Ménager已经提到)或者你可以用两个别名。window.d&nbsp;=&nbsp;document&nbsp;//&nbsp;A&nbsp;renamed&nbsp;reference&nbsp;to&nbsp;the&nbsp;object window.d.myAlias&nbsp;=&nbsp;window.d.getElementById
随时随地看视频慕课网APP
我要回答