JavaScript: Wie ist „Funktion onload () {}“ unterscheidet sich von „onload = function () {}“?

StackOverflow https://stackoverflow.com/questions/1818501

  •  10-07-2019
  •  | 
  •  
War es hilfreich?

Lösung

Diese zwei Schnipsel deklarieren eine Funktion im aktuellen Bereich, mit dem Namen „onload“. Keine Bindung erfolgt.

function onload() { ... }

.

var onload = function() { ... }

zuordnet Dieser Code-Schnipsel, eine Funktion zu einer Eigenschaft / Variable / Feld mit dem Namen „onload“ auf dem aktuellen Bereich:

onload = function() { ... }

Der Grund, warum Firefox die Bindung und hob das Onload-Ereignis auf dem ersten Schnipsel und die andere durchgeführt haben werden, nicht vielleicht, weil die Firefox Chrom (seine Benutzeroberfläche) selbst geschrieben und automatisiert mit Hilfe von JavaScript - das ist, warum es so flexibel ist und einfache Erweiterungen auf, es zu schreiben. Irgendwie, wenn Sie die lokal scoped onload Funktion auf diese Weise erklärt, Firefox „ersetzt“ die window der (höchstwahrscheinlich die lokalen Kontext zu der Zeit) Umsetzung von onload (zu diesem Zeitpunkt eine leere Funktion oder nicht definiert ist), wenn die anderen Browsern korrekt „Sandbox“, die Erklärung in einem anderen Rahmen (sagen wir, global oder etwas).

Andere Tipps

Viele Menschen sind unter Hinweis darauf, korrekt die globale / lokale Differenz zwischen ( UPDATE: Diese Antworten werden zumeist von ihren Autoren entfernt wurden jetzt )

var x = function() {

und

function x() {

Aber das ist nicht wirklich Ihre Frage beantworten, wie Sie sind eigentlich nicht den ersten davon zu tun.

Der Unterschied zwischen den beiden in Ihrem Beispiel ist:

// Adds a function to the onload event
onload = function() {
    alert("hello");
}

Die

// Declares a new function called "onload"
function onload() {
    alert("hello");
}

Hier ist, was ich denke, vor sich geht, basierend auf Tim Down hilfreiche Kommentare und einer kurzen Diskussion mit Jonathan Penn:

Wenn die JavaScript-Interpreter zur window.onload Eigenschaft zuordnet, spricht es zu einem Objekt, dass der Browser ihm gegeben hat. Der Setter, dass es ruft bemerkt, dass die Eigenschaft onload genannt wird, und geht so aus dem Rest des Browsers und die Leitungen der entsprechende Ereignis auf. All dies außerhalb des Rahmens JavaScript ist -. Das Skript sieht nur, dass die Eigenschaft festgelegt wurde

Wenn Sie eine Erklärung function onload() {} schreiben, wird der Setter nicht in genau der gleichen Weise aufgerufen. Da die Erklärung passieren eine Zuordnung verursacht Parst Zeit, nicht Auswertungszeit, geht die Skript-Interpreter vor und erstellt die Variable ohne den Browser zu sagen; oder auch das Fensterobjekt ist nicht bereit, Ereignisse zu empfangen. Was immer es ist, wird der Browser nicht die Chance bekommen, um die Zuordnung zu sehen, wie es funktioniert, wenn Sie schreiben onload = function() {}, die über die normalen Setter Routine geht.

Die einfachste Erklärung:

function aaaaaaa(){

Kann verwendet werden, bevor es declarated ist:

aaaaaaa();
function aaaaaaa(){

}

Aber das funktioniert nicht:

aaaaaaa();
aaaaaaa=function(){

}

Das ist, weil im dritten Code, Sie AAAAAAA auf eine anonyme Funktion zuweisen, nicht als Funktion erklärt.

Dies erzeugt einen Fehler:

foo();
var foo = function(){};

Dies gilt nicht:

foo();
function foo(){}

Die zweite Syntax ist also schöner, wenn Sie Funktionen verwenden Sie den Code modularisieren und zu organisieren, während die erste Syntax ist schöner für die Funktionen-as-Daten Paradigma.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top