为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript函数混叠似乎不起作用

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中工作。
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

必须将该方法绑定到Document对象。看:

>>> $ = document.getElementById
getElementById()>>> $('bn_home')[Exception... "Cannot modify properties of a WrappedNative" ... anonymous :: line 72 data: no]
>>> $.call(document, 'bn_home')<body id="bn_home" onload="init();">

在执行简单别名时,函数是在全局对象上调用的,而不是在文档对象上调用的。使用一种称为闭包的技术来修复这个问题:

function makeAlias(object, name) {
    var fn = object ? object[name] : null;
    if (typeof fn == 'undefined') return function () {}
    return function () {
        return fn.apply(object, arguments)
    }}$ = makeAlias(document, 'getElementById');>>> $('bn_home')<body id="bn_home" onload="init();">

这样,您就不会丢失对原始对象的引用。

在2012年,新的bind方法,该方法允许我们以更合理的方式执行此操作:

>>> $ = document.getElementById.bind(document)>>> $('bn_home')<body id="bn_home" onload="init();">


查看完整回答
反对 回复 2019-07-11
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

这是一个简短的回答。

下面是函数的副本(引用)。问题是,现在该函数位于window对象时,当它被设计为驻留在document对象。

window.myAlias = document.getElementById

可供选择的方案如下

  • 使用包装器(Fabien Ménager已经提到)
  • 或者你可以用两个别名。

    window.d = document // A renamed reference to the object
    window.d.myAlias = window.d.getElementById


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 422 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信