Javascript Function: Applying Apply

javascript

Solution

But why?

Let's reduce your calls step-by-step:

tester.apply.apply(tester, array) // resolves to
(Function.prototype.apply).apply(tester, array) // does a
tester.apply({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters');

Here you can see what's going wrong. Correct would be

var array = [
    {something: 'special'},
    ['and', 'a', 'bunch', 'of', 'parameters']
];

then the `apply.apply(tester, array)` would become

tester.apply({something: 'special'}, ['and', 'a', 'bunch', 'of', 'parameters']);

which does a

tester.call({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters');

So with your original `array` you'd need to use

(Function.prototype.call).apply(tester, array)

Problem

I got stumped by this weirdness. Let's say I have this array: ``` var array = [{ something: 'special' }, 'and', 'a', 'bunch', 'of', 'parameters']; ``` Could I `apply` the `apply` method of a function to invoke the function with the `this` object being `{something: 'special'}` and the parameters being the rest of `array`? In other words, could I do this ``` var tester = function() { console.log('this,', this); console.log('args,', arguments); }; tester.apply.apply(tester, array); ``` And expect the output to be the following? ``` > this, {"something": "special"} > args, {"0": "and", "1": "a", "2": "bunch", "3": "of", "4": "parameters"} ``` I tried it. ``` TypeError: Function.prototype.apply: Arguments list has wrong type ``` But why? It seems like this should work.

Original source