3

我正在尝试在 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);
};

但是,将函数分配给另一个名称时出现上述异常的原因是什么?

4

3 回答 3

6

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库中可用,后来被添加到语言中。

于 2010-04-16T23:09:30.653 回答
5

要在 Firefox 和 Google Chrome 中调用别名document.getElementById,您应该按如下方式进行:

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

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

于 2010-04-16T23:00:43.377 回答
1

您可以根据需要绑定或调用或应用,也可以直接分配功能,正如您所观察到的 -

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

但是为什么不稍微改进一下,或者有什么用呢?

var gete= function(s){return s && s.nodeType==1? s: document.getElementById(s)}
于 2010-04-17T04:25:24.023 回答