En las respuestas a this question, leemos que function f() {}
define el nombre localmente, mientras que [var] f = function() {}
lo define globalmente. Eso tiene mucho sentido para mí, pero hay un comportamiento extraño que es diferente entre las dos declaraciones.JavaScript: ¿En qué se diferencia "function onload() {}" de "onload = function() {}"?
Hice una página HTML con el guión
onload = function() {
alert("hello");
}
y funcionó como se esperaba. Cuando lo cambié a
function onload() {
alert("hello");
}
no sucedió nada. (Firefox todavía activó el evento, pero WebKit, Opera e Internet Explorer no lo hicieron, aunque francamente no tengo idea de cuál es la correcta)
En ambos casos (en todos los navegadores), pude verificar que ambos window.onload
y onload
se establecieron en la función. En ambos casos, el objeto global this
se establece en la ventana, y no importa cómo escriba la declaración, el objeto window
está recibiendo la propiedad muy bien.
¿Qué está pasando aquí? ¿Por qué una declaración funciona de manera diferente a la otra? ¿Es esto una peculiaridad del lenguaje JavaScript, el DOM o la interacción entre los dos?
Estoy empezando a sospechar que este es un error en Webkit/Opera y que Firefox tiene el comportamiento correcto. – Wogan
Ninguno de los dos es correcto per se. El objeto global (al que se refiere 'window') puede tener propiedades definidas por el host (como' onload') y una implementación de ECMAScript 3 es libre de implementar el comportamiento de dicha propiedad como lo considere adecuado, incluido el '[[ ]] 'método que se llama cuando se asigna el valor de la propiedad. –
En Firefox 3.5.5, veo la alerta si uso 'onload = function() {...};' pero no con 'var onload = function() {...};' –