将document.getElementById分配给另一个函数

时间:2010-04-16 22:42:40

标签: javascript first-class-functions

我正在尝试在JavaScript中执行以下操作:

var gete = document.getElementById;

但是我收到以下错误(来自FireBug的控制台):

uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: http://localhost:8080/im_ass1/ :: anonymous :: line 15" data: no]

现在显然我可以按如下方式包装函数:

var gete = function (id) {
    return document.getElementById(id);
};

但是,在将该函数分配给另一个名称时,我得到上述异常的原因是什么?

3 个答案:

答案 0 :(得分:5)

要在Firefox和Google Chrome中调用document.getElementById的别名,您应按以下方式执行此操作:

var gete = document.getElementById;
gete.call(document, 'header').innerHTML = 'new';

您可能需要查看以下Stack Overflow帖子,了解详细说明:

答案 1 :(得分:4)

ECMAScript 5引入了bind()函数,该函数将函数与对象绑定,以便可以直接调用它,而无需为每次调用使用func.call(thisObj)

var func = document.getElementById.bind(document);
func("foo");  // We don't have to use func.call(doument, "foo")

bind()首先在Prototype库中提供,后来又添加到该语言中。

答案 2 :(得分:1)

如果您愿意,您可以绑定或致电或申请,或者您可以直接分配该功能, 正如你所观察到的那样 -

var gete= function(s){return document.getElementById(s)}

但为什么不改善它,或者有什么用?

var gete= function(s){return s && s.nodeType==1? s: document.getElementById(s)}