¿Alguien puede explicar este método Javascript?


Fuente original: http://twitter.com/tobeytailor/status/8998006366

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

He notado que este comportamiento afecta a todos los tipos nativos. ¿Qué es exactamente lo que está pasando aquí?

Author: Esteban Küber, 2010-02-14

1 answers

Esto tiene que ver con la extraña forma en que el enlace this 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)();

Luego se ejecuta con this vinculado a la instancia de lista []. Pero si lo separas:

x= [].reverse;
x();

Se ejecuta sin this-binding, por lo que this en la función apunta al objeto global (window), en uno de los peores errores de diseño más engañosos de JavaScript.

(x=[].reverse)()

También está haciendo el desprendimiento. El operador de asignación devuelve el mismo objeto de función que se le pasó, por lo que parece que no está haciendo nada, pero tiene el efecto secundario de romper el caso especial limitado que hace que JavaScript se vincule this.

Así que estás diciendo: {[25]]}

Array.prototype.reverse.call(window)

reverse, como muchos otros métodos Array.prototype, está definido por ECMAScript para trabajar en cualquier objeto nativo similar a una secuencia. Invierte los elementos con las teclas number-string (hasta object.length) y devuelve el objeto. Así que devolverá el objeto que se pasó in para cualquier tipo que tenga una propiedad length.

window tiene una propiedad length, que corresponde a window.frames.length, por lo que llamar a este método con this apuntando a window funcionará y devolverá el window. En teoría todavía puede fallar, porque:

  1. Se permite que window sea 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
  2. si la ventana realmente tiene marcos / iframes, intentaría invertir su orden, lo que no funcionaría porque la colección de marcos es de solo lectura.

Sin embargo, en los navegadores actuales el primer caso funciona y el segundo falla silenciosamente sin un error, por lo que aún obtiene el comportamiento ===window y no una Excepción.

 40
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-14 16:22:17