Specifically looking at the advanced solution (I’ve solved it the other ways by myself):

**function largestOfFour ( arr ) {**

**return arr.map ( Function.apply.bind ( Math.max, null ));**

**}**

I get what its doing effectively in terms of creating a Math.max() function that takes an array argument but not how its doing it.

The major issue I am having trouble grasping is the behaviour of how * Function*.apply() or

*.bind() works versus an explicitly defined function such as in these 2 examples which I understand:*

**F**unctionGoing back to the solution, my best shot at reasoning what happens after map calls the chained function is:

**1.****Function.apply.bind ( Math.max, null, subArrayN );**

* 2.* Which breaks down to:

**Function.prototype.Math.max.apply ( null, subArrayN );**

**Which then breaks down to:**

*3.***Function.prototype.Math.max ( subArrayN );**

Where Math.max is the *this* argument for bind, null is the *this* argument for apply, and subArray is the array argument that will be used when Function is called. However I can’t make complete sense of this logic and feel like I’m way out to lunch.

This is because in my current logic Math.max would be added as a property of the function prototype and not as the context in which Function.prototype is being called. Or is it that Math.max is passed directly as the context object on which apply is called; and Function is a way of making Math.max.apply globally available as a new property of the Function object prototype?

I’d love for someone to articulate where I’m going wrong, this has been a really big monkey on my back. The * Function* part is what I really have no clue about, the rest I’m merely just confused about . Thanks in advance, sorry for being so long winded folks.