Question: I'm just wondering if anyone knows why `$.map` and `$.fn.map` pass arguments in flipped order from one-another. Is there a valid reason (e.g. ECMA specs somewhere) for it or was it just a poorly-planned API that is now impossible to fix due to the amount of code relying on jQuery?

```
$.map([ 'a', 'b', 'c' ], function(){ console.log(arguments); })
// ['a', 0], ['b', 1], ['c', 2]

$.fn.map.call([ 'a', 'b', 'c' ], function(){ console.log(arguments); })
// [0, 'a'], [1, 'b'], [2, 'c']

```

`.each` doesn't act like this

Answer: 
Indeed, that might be considered as an oversight, but there is a very good reason for the arguments to be passed in that order.

Of course, on the surface, that's because the [map()](http://api.jquery.com/map/) / [each()](http://api.jquery.com/jQuery.each/) methods and [$.map()](http://api.jquery.com/jQuery.map/) are not supposed to be equivalent, and each side is meant to be used in its own way (dealing with [jQuery objects](http://docs.jquery.com/Types#jQuery) and arrays/hashes, respectively).

But the main point is that *the parameter position is optimized for the case your callback function only wants to take a single argument*. Consider both cases:

* `map()` and `each()` are meant to be called on jQuery objects, and the callback function will be called in the context of each DOM element involved in the mapping/loop (the context object is available through the `this` keyword). So, it makes more sense to pass the index first, then the element, because `this` *already* designates the element.
* `$.map()` deals with arrays and Javascript objects (hashes), and the callback function is invoked in the "global" context (`this` is always the `window` object). So, it makes more sense to pass the value first, then the index, because mapping is about *avoiding loop index variables in the first place*. If the caller is interested in those, he can use a "standard" `for` loop (or the second argument passed to the callback function).
Ok, I did some digging in the code and the API changelog. 

`$.fn.map` internally calls `jQuery.map`.

Its a guess (somewhat calculated) but I believe it was done to add the ability to traverse objects/collections.