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';

この背後にある詳細な説明については、次のスタック オーバーフローの投稿を確認してください。

于 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 に答える