Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der Funktionsdefinition und des Unterschieds zwischen Deklaration und Ausdruck in JavaScript

Detaillierte Erläuterung der Funktionsdefinition und des Unterschieds zwischen Deklaration und Ausdruck in JavaScript

伊谢尔伦
伊谢尔伦Original
2017-07-21 13:48:461580Durchsuche

In js ist eine Funktion tatsächlich ein Objekt. Jede Funktion ist eine Instanz des Funktionstyps und verfügt über dieselben Eigenschaften und Methoden wie andere Referenztypen. Daher ist der Funktionsname tatsächlich ein Zeiger auf das Funktionsobjekt und nicht an eine Funktion gebunden. Zusätzlich zu den beiden gängigen Definitionen (siehe unten) gibt es eine weitere Definition, die dieses Konzept intuitiver widerspiegeln kann:


var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐

Der Funktionskonstruktor kann empfangen beliebig viele Parameter, der letzte Parameter wird jedoch immer als Funktionskörper betrachtet. Ein Nachteil dieser Methode besteht darin, dass der Code zweimal analysiert wird. Beim ersten Mal wird der grundlegende ES-Code analysiert, und beim zweiten Mal wird die an den Konstruktor übergebene Zeichenfolge analysiert . Hier schreiben Es hilft, das Konzept zu verstehen, dass Funktionen in js tatsächlich Objekte sind.

(1) Es gibt kein Konzept der Überladung in js-Funktionen

Wenn es um das Konzept der Überladung geht, vergleichen wir es damit, wie Überladung in Java implementiert wird: In Java In wird eine Methode durch ihre Methodensignatur eindeutig identifiziert. Die Methodensignatur umfasst: Methodenname, Anzahl der Parameter, Parameterreihenfolge und Parametertyp. Wenn also die Methodennamen zweier Methoden gleich sind, andere Signaturelemente jedoch unterschiedlich sind, betrachtet der Compiler sie als zwei verschiedene Methoden, sodass verschiedene Methoden mit demselben Namen vorhanden sein können, um das Konzept der Überladung zu realisieren. (Zitat: Wie man tief verstehen kann, warum es in js keine Überladung gibt – Manxisuos Antwort in Segmentfault).

Wie oben erwähnt, ist der Funktionsname in js tatsächlich ein Zeiger auf das Funktionsobjekt. Daher kann man sagen, dass der Funktionsname der eindeutige Bezeichner einer Funktion ist Daher wird es nicht für zwei Funktionen mit demselben Namen angezeigt (da ein Zeiger nur auf ein Objekt gleichzeitig zeigen kann). Zum Beispiel:


function sum(num1, num2){
return num1 + num2;
}
function sum(num1, num2, num3){
return num1 + num2 + num3;
}

Das Obige kann auch anders geschrieben werden, was intuitiver ist:


var sum = function(num1, num2){
return num1 + num2;
}
sum = function(num1, num2, num3){
return num1 + num2 + num3;
}

Es ist offensichtlich, dass die obige Linie die Summe auf Funktion (num1, num2) und dann auf die Summe auf Funktion (num1, num2, num3) zeigt, was dazu führt, dass der zweite Zeiger den ersten Zeiger überschreibt Es ist offensichtlich, dass es in js kein Konzept der Überladung gibt.

(2) Der Unterschied zwischen Funktionsdeklaration und Funktionsausdruck

Wir wissen, dass es zwei häufig verwendete Methoden zum Definieren von Funktionen gibt: Funktionsdeklaration und Funktionsausdruck.

Funktionsdeklaration kann als die gebräuchlichste Definitionsmethode bezeichnet werden, wie im folgenden Beispiel gezeigt:


function sum(num1, num2){
return num1 + num2;
}

Funktionsausdruck, diese Definitionsmethode wird in Abschlüssen verwendet. Und es wird häufig in einigen Frameworks verwendet, beispielsweise im allgemeinen $scope.doSomething = function(){...} in Angular:


sum = function(num1, num2){
return num1 + num2;
};

Die beiden oben genannten Definitionsmethoden sind fast gleich, es gibt jedoch einen kleinen Unterschied. Schauen Sie sich bitte das folgende Beispiel an:


//函数声明
alert(sum(100, 100));
function sum(num1, num2){
return num1 + num2;
}
//函数表达式
alert(sum(100, 100));
var sum = function(num1, num2){
return num1 + num2;
};

Diese beiden Codeteile sehen so aus: Der Unterschied ist nicht groß, nur die Art und Weise, wie die Funktion definiert ist, ist unterschiedlich. Tatsache ist jedoch, dass der erste Absatz gut funktioniert, der zweite Absatz jedoch einen Fehler auslöst. Dies liegt daran, dass der Parser bereits Funktionsdeklarationen gelesen und zur Ausführungsumgebung hinzugefügt hat, bevor der Code ausgeführt wird, und zwar durch einen Prozess namens „Funktionsdeklarations-Hoisting“. Einfach ausgedrückt: Der Parser platziert die Funktionsdeklaration zunächst oben im Quellbaum. Im folgenden Code befindet sich die Funktion in einer Initialisierungsanweisung (sie wird nicht an die Spitze gesetzt), bevor die Zuweisungsanweisung ausgeführt wird. sum zeigt also nicht auf eine Funktion, sodass ein vorheriger Aufruf der Funktion einen Fehler meldet.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Funktionsdefinition und des Unterschieds zwischen Deklaration und Ausdruck in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn