2010-05-09 14 views
5

¿Por qué DOM tiene un objeto llamado self y otro llamado window cuando son la misma cosa? Para aumentar la confusión window una propiedad ha llamado self manera:¿Por qué DOM tiene ventana y uno mismo?

window === window.self === self 

¿Por qué es así? ¿Cuál debería usar?

+0

¿Por qué necesita hacer una referencia? 'window' es parte del DOM, mientras que' self' se relaciona con el objeto global en javascript, que pasa a ser igual a la ventana de DOM en la mayoría de las implementaciones. En implementaciones sin navegador como Rhino, 'self' está presente, pero no' window' ya que no hay DOM. –

+0

@Sean: 'self' no aparece en el estándar Javascript (ECMAScript). Para acceder de forma fiable al objeto global por nombre en todas las implementaciones, debe asignarle un nombre, ejecutando algo como esto en el contexto global (fuera de cualquier función): 'var global = this;' Eso funciona porque cuando el control ingresa al el código del contexto global, 'this' apunta al objeto global. 'self' no tiene ningún sentido como un nombre para el objeto global fuera del contexto' window.self' en mi humilde opinión. –

+0

@ T.J Estaba a punto de agregar el mismo –

Respuesta

5

self está definido por el entorno javascript y apunta al objeto [global] (pero no es parte de la especificación, por lo que podría no estar allí), mientras que window es parte de la especificación DOM. En la mayoría de los navegadores se usa window como el objeto [global], pero esto no siempre es así.

Eso self == window.self no es extraño, ya que son el mismo objeto - cuando se busca self, se encuentra como una propiedad del objeto global (window). Por lo tanto, es de hecho lo mismo que window.self == window.self.

Como se indicó en otra parte, para hacer referencia confiable al objeto [global], debe definirlo como sef ejecutando var global = this; en el contexto de ejecución global.

+0

Entiendo que ambos son indicadores del mismo objeto. Simplemente me pilló como raro que un objeto del DOM tenga como propiedad en sí mismo porque no es evidente por qué alguien intencionalmente diseñaría algo así. – hekevintran

+2

No es nada extraño si conoce los contextos de ejecución que se crean en ECMAScript. Después de todo, la propiedad 'self' debe definirse en algún lugar accesible ¿no? Y eso es como una propiedad del objeto '[global]' en sí. Que la propiedad apunta al objeto '[global]' no es realmente relevante aquí. –

+0

Entonces, ¿está diciendo que 'self' es como' var global = this; 'en el contexto de ejecución global? Supongo que mi pregunta es: ¿por qué 'self' existe si el navegador nos da' window'? – hekevintran

1

Cuando usted está llamando self que eswindow.self, por lo mismo que allí, como cualquier otra propiedad global (por ejemplo location es realmente window.location).

¿La razón por la que está allí? Por lo general, los controles de este tipo:

if(window.top != window.self) { 
    alert("We're in a frame"); 
} 
+0

@ T.J. Si 'window.top' y' window.self' han cambiado los tipos, tienes problemas mayores en tu JS :) En cuanto a la primera verificación, sí, podrías usar 'window', pero' window.self! = Window.top' es mucho * más claro * fue mi punto :) –

+1

Gotcha. (Y en tipo: Sí, pero bueno, podría suceder! 'Window.top =" ranas ";' ;-)) –

+1

@ T.J.Oh, definitivamente puede pasar :) IE anterior permitiéndote redefinir el objeto 'window' en sí mismo, buenos tiempos –

0

El mundial self es un acceso directo a window.self. Ambos son el mismo objeto.

En cuanto a por qué hay tanto window y self, en un contexto de página web, self es siempre igual a window (por lo que yo sé). Pero supongo que esto no siempre tiene que ser así: JavaScript/ECMAScript no está limitado a su uso en una página web donde hay un DOM.

En cuanto a qué usar, ambos deben ser seguros de usar en un contexto de página web normal AFAIK. Ver el comentario de @ Nick para buenos argumentos para usar window, sin embargo.

+1

No usaría' self' personalmente ... muchos frameworks/código misc usan esto como una variable local internamente y posiblemente en el el cierre lo está alimentando, por lo que 'self' may * not * be' window.self' en algunos casos. –

+0

@Nick buenos puntos, editó mi respuesta para reflejarlos. –

Cuestiones relacionadas