Esto tiene que ver con la forma extraña this
vinculante funciona en JavaScript.
[].reverse
es el método reverse
en una lista vacía. Si usted lo llama, a través de uno de:
[].reverse();
[]['reverse']();
([].reverse)();
entonces se ejecuta con this
unido a la instancia de la lista []
. Pero si separarla:
x= [].reverse;
x();
se ejecuta sin this
unión al, por lo this
en los puntos de función a la (window
) objeto global, en uno de los peores errores de diseño, más engañosas de JavaScript.
(x=[].reverse)()
También está haciendo el desmontaje. El operador de asignación devuelve el mismo objeto de función que se pasó para que parezca que no está haciendo nada, pero tiene el efecto secundario de romper el caso especial limitado que provoca que JavaScript se vincule al this
.
Así que ustedes están diciendo:
Array.prototype.reverse.call(window)
reverse
, al igual que muchos otros métodos Array.prototype
, se define por ECMAScript para trabajar en cualquier objeto de secuencia nativa similar. Invierte los elementos con las teclas de cadena numérica (hasta object.length
) y devuelve el objeto. Por lo tanto, devolverá el objeto que se pasó para cualquier tipo que tenga una propiedad length
.
window
tiene una propiedad de longitud, que corresponde a window.frames.length
, por lo que llamar a este método con this
apuntando a window
va a funcionar y devolver el window
. En teoría todavía puede fallar, debido a que:
window
se le permite ser un “objeto host” en lugar de un “objeto nativo”; en este caso, las garantías sobre lo que puede pasar a los métodos de otros prototipos no se aplican necesariamente; y
- si la ventana tiene cuadros/marcos, intentaría invertir su orden, lo que no funcionaría porque la colección de cuadros es de solo lectura.
Sin embargo, en los navegadores actuales el primer caso hace el trabajo y el segundo error de forma silenciosa y sin un error, por lo que aún obtener el comportamiento ===window
y no una excepción.
'[] .reverse.call (y) === y' para todos los escalares' y'. – kennytm
* He notado que este comportamiento ... * ¿Qué comportamiento? – Cheeso