In den Antworten auf this question lesen wir, dass function f() {}
den Namen lokal definiert, während [var] f = function() {}
es global definiert. Das macht Sinn für mich, aber es gibt ein merkwürdiges Verhalten, das sich zwischen den beiden Erklärungen unterscheidet.JavaScript: Wie unterscheidet sich "function onload() {}" von "onload = function() {}"?
ich eine HTML-Seite mit dem Skript gemacht
onload = function() {
alert("hello");
}
und es funktionierte wie erwartet. Als ich es zu
function onload() {
alert("hello");
}
änderte, passierte nichts. (Firefox hat immer noch das Ereignis ausgelöst, aber WebKit, Opera und Internet Explorer nicht, obwohl ich ehrlich gesagt keine Ahnung habe, welche korrekt ist.)
In beiden Fällen (in allen Browsern) konnte ich überprüfen, dass beide window.onload
und onload
wurden auf die Funktion eingestellt. In beiden Fällen wird das globale Objekt this
auf das Fenster festgelegt, und egal wie ich die Deklaration schreibe, empfängt das window
Objekt die Eigenschaft einwandfrei.
Was geht hier vor? Warum funktioniert eine Erklärung anders als die andere? Ist das eine Eigenart der JavaScript-Sprache, des DOM oder der Interaktion zwischen den beiden?
Ich fange an zu vermuten, dass dies ein Fehler in Webkit/Opera ist und dass Firefox das richtige Verhalten hat. – Wogan
Weder ist an sich korrekt. Das globale Objekt (auf das sich 'window' bezieht) kann Host-definierte Eigenschaften haben (wie 'onload') und eine ECMAScript3-Implementierung ist frei, das Verhalten einer solchen Eigenschaft zu implementieren, einschließlich der internen' [[Put ]] 'Methode, die aufgerufen wird, wenn der Wert der Eigenschaft zugewiesen wird. –
In Firefox 3.5.5 sehe ich die Warnung, wenn ich 'onload = function() {...};' aber nicht mit 'var onload = function() {...};' –