ist ein Funktionsausdruck , während
%Vor%ist eine Funktionsdeklaration .
Um Juriy 'kangax' Zaytsev über Funktionsausdrücke vs. Funktionsdeklarationen zu zitieren :
Es gibt einen feinen Unterschied in Verhalten von Deklarationen und Ausdrücke.
Zunächst Funktionsdeklarationen werden vor jedem analysiert und ausgewertet andere Ausdrücke sind. Selbst wenn Die Deklaration wird zuletzt in a positioniert Quelle wird es ausgewertet werden vor allen anderen Ausdrücken , die in einem Bereich enthalten sind. [...]
Ein anderer wichtiges Merkmal der Funktion Deklarationen sind das Deklarieren bedingt ist nicht standardisiert und variiert in verschiedenen Umgebungen. Sie sollten sich nie auf Funktionen verlassen unter Vorbehalt erklärt und benutzt werden Funktion Ausdrücke stattdessen.
In diesem Fall, wie Joel Coehoorn in einem Kommentar erwähnt, ist gameOfLife
bedingt definiert, also muss ein Funktionsausdruck verwendet werden.
Ein allgemeiner Anwendungsfall für diese bedingt definierten Funktionen ist die Verbesserung der JavaScript-Funktionalität in Browsern, die keine native Unterstützung für neuere Funktionen haben (in früheren ECMAScript / JavaScript-Versionen nicht verfügbar). Sie möchten dies nicht mit Funktionsdeklarationen tun, da diese die native Funktionalität sowieso überschreiben werden, was höchstwahrscheinlich nicht Ihren Vorstellungen entspricht (unter Berücksichtigung der Geschwindigkeit usw.). Ein kurzes Beispiel davon:
%Vor% Ein Hauptnachteil von Funktionsausdrücken besteht darin, dass Sie einer Variablen tatsächlich eine anonyme Funktion zuweisen. Dies kann das Debuggen erschweren , da der Funktionsname normalerweise nicht bekannt ist, wenn die Skriptausführung angehalten wird (z. B. an einem Haltepunkt setzen Sie). Einige JavaScript-Debugger, wie Firebug, versuchen, den Namen der Variablen anzugeben, der die Funktion zugewiesen wurde, aber da der Debugger dies erraten muss, indem er den Inhalt des Skripts im Handumdrehen analysiert, kann dies zu schwierig sein (was zu einem (?)()
wird anstelle eines Funktionsnamens angezeigt oder ist sogar falsch.
(zum Beispiel lesen Sie weiter auf der Seite, obwohl der Inhalt nicht ganz für Anfänger geeignet ist)
In JavaScript sind Funktionen erstklassige Objekte . Sie könnten sie in Objekten (Variablen) speichern und sie als Argumente an Funktionen übergeben. Jede Funktion ist eigentlich ein Function
-Objekt.
gol
ist ein Objekt, das mit dem Objektliteral Notation.
1) Was ist im folgenden Code der Grund dafür, dass gameOfLive eine Variable ist und nicht nur eine "function gameOfLife ()"?
Auf der globalen Ebene definierte Variablen sind Mitglieder des Fensterobjekts. Indem Sie es zu einer Variablen machen, können Sie die Syntax window.gameOfLife()
verwenden. Deshalb können sie den if (!window.gameOfLife)
check am Anfang Ihres Snippets verwenden.
Aber das erklärt nicht wirklich, warum sie es so gemacht haben, und eine Funktionsdeklaration würde das Gleiche tun. Marcel Korpels Antwort erklärt besser das "Warum" der beiden Optionen.
2) was ist gol? Es scheint wie ein Array, aber ich bin nicht vertraut mit der Syntax oder wie es heißt.
Die Syntax wird als kompakte Objektnotation bezeichnet. Interessant ist hier, dass das "kompakte" Objekt innerhalb einer Funktion deklariert wird. Das Deklarieren eines Objekts in einer Funktion wie dieser ist nützlich, da Sie es verwenden können, um JavaScript-Objekte mit (effektiv) privaten Elementen zu erstellen.
Der Schlüssel ist, sich daran zu erinnern, dass Funktionen und Objekte in Javascript dasselbe sind . Daher ist die vollständige Funktion gameOfLife()
in Wirklichkeit eine Objektdefinition. Darüber hinaus ist das Objekt gol
, das als Mitglied von gameOfLife
deklariert wurde, höchstwahrscheinlich Teil einer allgemeinen Technik zum Definieren privater Mitglieder. Die gameOfLife()
Funktion / Objekt wird dieses gol
-Objekt zurückgeben. Alle anderen Elemente, die innerhalb der gameOfLife()
-Funktion / -Objekt deklariert sind, werden effektiv private Mitglieder der zurückgegebenen gol
-Instanz, während alles, was innerhalb des gol
-Objekts deklariert ist, öffentlich ist. Was sie wirklich machen wollen, ist schließlich Code wie folgt zu schreiben:
Wenn sie das tun, wird die Spielvariable ein gol
-Objekt enthalten. Die Methoden in diesem Objekt haben weiterhin Zugriff auf Elemente, die in der vollständigen Funktion gameOfLife()
deklariert sind, anderer Code jedoch nicht (zumindest nicht so einfach). Daher sind diese Elemente effektiv privat. Elemente im Objekt gol
sind noch öffentlich. Somit haben Sie ein Objekt mit privaten und öffentlichen Membern für eine korrekte Kapselung / Informationsverbergung, genau wie Sie es mit anderen objektorientierten Sprachen erstellen würden.
Wenn Sie eine Funktion in eine Variable einfügen, können Sie später dazukommen und sie durch eine andere Funktion ersetzen, die die Funktion transparent für den Rest Ihres Codes ersetzt. Dies ist dasselbe, was Sie tun, wenn Sie "onClick=" in einem Formular-Widget angeben.
sicher: um die Syntax zu erklären:
Funktionen sind erstklassige Objekte in Javascript, so dass Sie eine Funktion in eine Variable einfügen können. daher ist der Hauptteil dieses Codes tatsächlich eine Funktionsdefinition, die in var gameOfLife gespeichert ist und später durch Aufruf von:
verwendet werden kann %Vor%gol ist ein Objekt (Hash), und "init" ist ein weiteres Beispiel für die obige Syntax, außer dass es direkt in den "init" Schlüssel im "gol" Hash eingegeben wird. So das Funktion könnte wiederum aufgerufen werden:
%Vor% Laut dieser Seite ist die Angabe von gameOfLife
auf ihre Art nicht anders als die Anmeldung als Ihre Weg. Die Art, wie sie gol
definieren, macht es zu einem Objekt (oder Sie können es sich als assoziatives Array vorstellen). Eine ähnliche Abkürzung für Arrays besteht darin, eckige Klammern anstelle von geschweiften Klammern zu verwenden.
Tags und Links javascript conways-game-of-life