3

I am trying to do the following in JavaScript:

var gete = document.getElementById;

But I am getting the following error (From FireBug's Console):

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]

Now obviously I can wrap the function as follows:

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

But what is the reason I'm getting the above exception when assigning the function to another name?

Andreas Grech
  • 105,982
  • 98
  • 297
  • 360

3 Answers3

7

ECMAScript 5 introduces the bind() function that binds a function with an object so that it can be called directly without having to use func.call(thisObj) for each call.

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

bind() was first available in the Prototype library and was later added to the language.

Alex Jasmin
  • 39,094
  • 7
  • 77
  • 67
5

To invoke an alias of document.getElementById in Firefox and Google Chrome, you should be doing it as follows:

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

You may want to check out the following Stack Overflow post for a detailed explanation behind this:

Community
  • 1
  • 1
Daniel Vassallo
  • 337,827
  • 72
  • 505
  • 443
1

You can bind or call or apply if you like, or you can assign the function directly, as you observed-

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

But why not improve it a tad, or what's the use?

var gete= function(s){return s && s.nodeType==1? s: document.getElementById(s)}
Daniel Vassallo
  • 337,827
  • 72
  • 505
  • 443
kennebec
  • 102,654
  • 32
  • 106
  • 127