Can somebody explain this Javascript method?

Original source:

(x=[].reverse)() === window // true

I’ve noticed that this behavior affects all the native types. What exactly is happening here?

This is to do with the weird way this binding works in JavaScript.


is the method reverse on an empty list. If you call it, through one of:


then it executes with this bound to the list instance []. But if you detach it:

x= [].reverse;

it executes with no this-binding, so this in the function points to the global (window) object, in one of JavaScript’s worst, most misleading design mistakes.


Is also doing the detach. The assignment operator returns the same function object it was passed so it looks like it’s doing nothing, but it has the side-effect of breaking the limited special case that causes JavaScript to bind this.

So you are saying:

reverse, like many other Array.prototype methods, is defined by ECMAScript to work on any native sequence-like object. It reverses the items with number-string keys (up to object.length) and returns the object. So it’ll return the object that was passed in for any type that has a length property.

window has a length property, which corresponds to window.frames.length, so calling this method with this pointing at window will work and return the window. In theory it may still fail, because:

  1. window is allowed to be a “host object” rather than a “native object”; in this case the guarantees about what you can pass to other prototypes’ methods don’t necessarily apply; and
  2. if the window actually has frames/iframes, it would try to reverse their order, which wouldn’t work because the frame collection is read-only.
Read More:   ES6 module Import giving "Uncaught SyntaxError: Unexpected identifier"

However, in current browsers the former case does work and the latter fails silently without an error, so you still get the ===window behaviour and not an Exception.

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Similar Posts