Como se mencionó en la respuesta anterior, este comportamiento se conoce como named access on the window object. El valor del atributo name
para algunos elementos y el valor del atributo id
para todos los elementos están disponibles como propiedades del objeto global window
. Estos se conocen como elementos con nombre. Como el window
es el objeto global en el navegador, cada elemento nombrado será accesible como una variable global.
Esto fue originalmente agregado por Internet Explorer y finalmente fue implementado por todos los demás navegadores simplemente por compatibilidad con sitios que dependen de este comportamiento. Curiosamente, Gecko (motor de renderizado de Firefox) optó por implementar esto solo en quirks mode, mientras que otros motores de renderización lo dejaron en modo estándar.
Sin embargo, a partir de Firefox 14, Firefox now supports named access en el objeto window
en el modo de estándares también. ¿Por qué cambiaron esto? Resulta que todavía hay muchos sitios que dependen de esta funcionalidad en modo estándar. Microsoft incluso released a marketing demo que lo hizo, evitando que la demostración funcione en Firefox.
Webkit ha recientemente considered the opposite, relegando el acceso con nombre en el objeto window
al modo peculiar solo. Decidieron no hacerlo por el mismo razonamiento que Gecko.
Tan ... loco como parece, este comportamiento ahora es técnicamente seguro de usar en la última versión de todos los principales navegadores en el modo de estándares. Pero aunque el acceso con nombre puede parecer algo conveniente, no debe usarse.
¿Por qué? Muchos de los razonamientos se pueden resumir en este artículo sobre por qué global variables are bad. En pocas palabras, tener un montón de variables globales adicionales conduce a más errores. Digamos que accidentalmente ingresas el nombre de var
y escribes un id
de un nodo DOM, ¡SORPRESA!
Además, a pesar de estar estandarizado todavía hay bastantes discrepancias en las implementaciones del navegador de acceso con nombre.
- IE incorrectamente hace que el valor del atributo
name
sea accesible para los elementos del formulario (entrada, seleccionar, etc.).
- Gecko y Webkit incorrectamente NO hacen accesibles las etiquetas
<a>
a través de su atributo name
.
- Gecko maneja incorrectamente múltiples elementos con el mismo nombre (devuelve una referencia a un solo nodo en lugar de una matriz de referencias).
Y estoy seguro de que hay más si intenta utilizar el acceso con nombre en casos extremos.
Como se menciona en otras respuestas, use document.getElementById
para obtener una referencia a un nodo DOM por su id
. Si necesita obtener una referencia a un nodo mediante su atributo name
, use document.querySelectorAll
.
Por favor, no propague este problema mediante el acceso con nombre en su sitio. Muchos desarrolladores web han perdido el tiempo tratando de rastrear este comportamiento mágico. Realmente necesitamos tomar medidas y hacer que los motores de renderizado desactiven el acceso con nombre en el modo estándar. En el corto plazo, romperá algunos sitios haciendo cosas malas, pero a la larga ayudará a avanzar en la web.
Si te interesa hablo de esto con más detalle en mi blog - http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/.
Véase también [¿Por qué no nos ¿usar identificadores de elementos como identificadores en JavaScript?] (http://stackoverflow.com/q/25325221/1048572) sobre por qué no se debe usar, y [¿Existe alguna especificación de que el ID de los elementos se convierta en variable global?] (http://stackoverflow.com/q/6381425/1048572) sobre cómo se especifica. – Bergi
@Bergi, el comentario que dice no hacer esto ahora está desactualizado e incluso inválido. Por lo tanto, no puedo encontrar una razón concreta para no usar esta característica. –
@EdmundReed Es posible que desee volver a leer la respuesta de la pregunta vinculada: sigue siendo una mala idea: "* las variables globales implícitamente declaradas *" tienen compatibilidad incorrecta con herramientas y "* conducen a código quebradizo *". No lo llame "característica", la respuesta a continuación explica cómo es solo un error que se convirtió en parte del estándar por razones de compatibilidad. – Bergi