2010-02-14 15 views

Respuesta

40

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:

  1. 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
  2. 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.

+1

¿Por casualidad sabes por qué alguien codificaría eso? Quiero decir, entiendo por qué el efecto ocurre, por supuesto, pero ¿por qué debería poner eso en mi código? ¿Qué logra? – Pointy

+3

Absolutamente nada. Simplemente está mostrando uno de los muchos comportamientos inesperados de JavaScript.Si encontrara esto en código real ¡me preocuparía! – bobince

+2

Una posible razón para hacer esto podría ser comprobar si alguna otra secuencia de comandos alteró el objeto ventana ('window = open ('http://google.com/')' es suficiente). 'var window = (x = []. Reverse)();' podría restaurarlo localmente. – silviot

Cuestiones relacionadas