2011-08-10 12 views
5

No puedo entender por qué window está por debajo de self y self está por debajo del objeto window.Autorretrato extraño en el objeto ventana

si va a dev-tools o Firebug y escribe window tiene DOM window objeto que self se encuentra bajo este objeto. ¡La parte extraña es que window está bajo self otra vez!

Puede escribir

window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self.window.self 

y aún así obtener window objeto!

¿Cómo?

+0

Consulte http://stackoverflow.com/questions/6145544/self-document-this-top-window – Shaz

+0

¿No ha visto autorreferencias antes? Es bastante común en el patrón singleton, por ejemplo, y dado que javascript carece de variables privadas directamente, es posible que pueda acceder a él infinito ... No digo este "ES" el caso, sino un caso de uso o una explicación de por qué podría ser – PhD

+0

Este es un objeto, no una función. incluso si hay un método de creación de objetos con autorreferencia en JavaScript, estaría más que feliz de saberlo. – Mohsen

Respuesta

5

En respuesta a una de mis comentarios:

Es una referencia circular, por lo que no termina. El compilador solo crea una referencia. Simplemente resulta ser una referencia de regreso al objeto original en el que se creó la referencia. Es por eso que puede hacer window.window.window ... Me gusta esto: var obj = {}; obj.obj = obj ;. Solo se creó una referencia, pero es una referencia de regreso al original , por lo que puede hacer obj.obj.obj.obj.obj.obj.obj === obj.

comentario se puede ver aquí: Is window really global in Javascript?

+0

OK. var obj = {} y luego obj.obj = obj pero ¿qué hay de var obj = {}; obj.self = obj ;? Ahora obj.self.obj return undefined – Mohsen

+0

@Mohsen: 'self' es una propiedad de' window'. 'window.self === window'. Entonces tiene sentido que también obtengas 'window.self === window.self'. El comentario en mi publicación solo se refería a 'window.window'. – Shaz

+0

¿Sabes cómo reproducir algo como esto en JavaScript? "objeto principal y autorreferenciado": - \ – Mohsen

1

Ver this page y see here. window.window es una referencia a sí mismo, por lo que puede repetir window.window.window ... window, siempre devolverá la ventana actual. self devuelve una referencia a la ventana actual, por lo que aquí es lo mismo, devolverá siempre el objeto DOMWindow.

+0

Gracias, entiendo cómo funciona window.window.window a través del enlace MDN. Entonces, ¿cómo se hace un objeto de autorreferencia? – Mohsen

+0

@Mohsen lo hiciste en uno de tus otros comentarios 'var obj = {}; obj.self = obj; '. Ahora, 'obj.self == obj.self.self == obj.self.self.self == obj'. – Pointy

+0

sí, obj.self.self.self ... se ve bien. pero yo no tengo obj en eso. entonces obj.self.obj no funciona. (¿cómo se marca el código en los comentarios ?!) – Mohsen

Cuestiones relacionadas