Object has no method 'apply'

javascript, jquery

Solution

Update:

Youve said that `property.actfn` is a string, `"paySomeoneClick"`. It's best not to use strings for event handlers, use functions instead. If you want the function `paySomeoneClick`, defined in the string, to be called, and if that function is global, you can do this:

anchorElement.on('click',function(event) {
    return window[property.fnctn](event);
});

That works because global functions are properties of the global object, which is available via `window` on browsers, and because of the bracketed notation described below.

If the function is on an object you have a reference to, then:

anchorElement.on('click',function(event) {
    return theObject[property.fnctn](event);
});

That works because in JavaScript, you can access properties of objects in two ways: Dotted notation with a literal property name (`foo.bar` accesses the `bar` propety on `foo`) and bracketed notation with a string property name (`foo["bar"]`). They're equivalent, except of course in the bracketed notation, the string can be the result of an expression, including coming from a property value like `property.fnctn`.

But I would recommend stepping back and refactoring a bit so you're not passing function names around in strings. Sometimes it's the right answer, but in my experience, not often. :-)

Original answer:

(This assumed that `property.fnctn` was a function, not a string. But may be of some use to someone...)

The code

anchorElement.on('click',property.fnctn);

will attach the function to the event, but during the call to the function, `this` will refer to the DOM element, not to your `property` object.

To get around that, use jQuery's `$.proxy`:

anchorElement.on('click',$.proxy(property.fnctn, property));

...or ES5's `Function#bind`:

anchorElement.on('click',property.fnctn.bind(property));

...or a closure:

anchorElement.on('click',function(event) {
    return property.fnctn(event);
});

More reading (on my blog):

- Mythical methods

- You must remember `this`

- Closures are not complicated

Problem

I am creating a few DOM elements dynamically like, ``` var anchorElement = jQuery('<a />',{text:property.text}); var liElement = jQuery('<li />',{"class":"navlink_"+i,id:"navlink_"+i}); anchorElement.on('click',property.fnctn); liElement.append(anchorElement); parentID.append(liElement); ``` Where `property` is a JSON object. `property.text` is the text that I want to put into anchor element. (Works fine) I want to attach a click event handler to that anchor element. The function that needs to be bound to that element is specified in JSON and we can access it like ``` property.fnctn ``` The following line should bind the event handler to the anchor element. ``` anchorElement.on('click',property.fnctn); ``` This was not working so I tried converting it into string like, ``` anchorElement.on('click',property.fnctn.toString()); ``` No Success... When I click on this link, the error is logged in the console The object has no method 'apply'. What is the reason...??? I am able to get it working with a slight work around like ``` anchorElement.attr('onclick',property.fnctn+"()"); ``` Above statement works, but I want to know why `.on()` API is not working. Thanks :) AÐitya.

Original source