Heim Web-Frontend js-Tutorial Detaillierte Erläuterung der Javascript-Funktionsdeklaration und des rekursiven Aufrufs

Detaillierte Erläuterung der Javascript-Funktionsdeklaration und des rekursiven Aufrufs

Dec 09, 2016 pm 01:21 PM
javascript

Die Art und Weise, wie Javascript-Funktionen deklariert und aufgerufen werden, ist bereits ein abgedroschenes Klischee, aber manche Dinge sind so. Du sagst es einmal und ich werde es noch einmal sagen. Jedes Mal, wenn ich sehe, dass es vier Möglichkeiten gibt, eine in einem Buch oder Blog geschriebene Javascript-Funktion aufzurufen, denke ich an Kong Yiji: Es gibt vier Möglichkeiten, das Wort „Fenchel“ zu schreiben. Kennen Sie das?

Trotz seiner vielen Mängel ist Javascript faszinierend. Das Herzstück der vielen schönen Funktionen von Javascript sind Funktionen als erstklassige Objekte. Funktionen werden wie andere normale Objekte erstellt, Variablen zugewiesen, als Argumente übergeben, geben Werte zurück und enthalten Eigenschaften und Methoden. Als Objekte der obersten Ebene verleihen Funktionen Javascript leistungsstarke funktionale Programmierfunktionen und bringen darüber hinaus eine Flexibilität mit sich, die nicht leicht zu kontrollieren ist.

1. Funktionsdeklaration

Variablendeklaration erstellt zunächst eine anonyme Funktion und weist sie dann einer angegebenen Variablen zu:

var f = function () { // function body };
Nach dem Login kopieren

Normalerweise muss es uns egal sein, ob der Gültigkeitsbereich des Ausdrucks auf der rechten Seite des Gleichheitszeichens global ist oder sich innerhalb eines Abschlusses befindet, da er nur über die Variable f auf der linken Seite des Gleichheitszeichens referenziert werden kann sign. Worüber man sich Gedanken machen sollte, ist der Umfang der Variablen f . Wenn der Verweis von f auf die Funktion zerstört wird (f = null) und die Funktion keiner anderen Variablen oder Objekteigenschaft zugewiesen ist, wird die anonyme Funktion durch den Garbage-Collection-Mechanismus zerstört, da alle Verweise verloren gehen.

Sie können auch Funktionsausdrücke verwenden, um Funktionen zu erstellen:

function f() { // function body }
Nach dem Login kopieren

Im Gegensatz zu Variablenausdrücken ist diese Deklarationsmethode eine integrierte Funktion. Zuweisen einen Wert für den Attributnamen. Weisen Sie die Funktion gleichzeitig einer Variablen mit demselben Namen im aktuellen Bereich zu. (Die Namensattribute der Funktion, konfigurierbar, aufzählbar und beschreibbar, sind alle falsch)

function f() { // function body }
console.log(f.name); // "f"
console.log(f); // f()
Nach dem Login kopieren


Javascript-Variablen haben nämlich eine besondere Funktion Sie rücken die Deklaration von Variablen voran, und die Funktionsdeklaration eines Ausdrucks treibt auch die Definition der gesamten Funktion voran, sodass Sie sie vor der Funktionsdefinition verwenden können:

console.log(f.name); // "f"
console.log(f); // f()
function f() { // function body }
Nach dem Login kopieren

Funktionsausdrucksdeklarationen werden auf die oberste Ebene des Bereichs hochgestuft. Probieren Sie den folgenden Code aus. Sie stehen nicht im Mittelpunkt dieses Artikels:

var a = 0;
console.log(a); // 0 or a()?
function a () {}
Nach dem Login kopieren

Crockford empfiehlt, immer den ersten Weg zu verwenden Um Funktionen zu deklarieren, wird angenommen, dass die zweite Methode die Anforderung lockert, dass Funktionen zuerst deklariert und dann verwendet werden müssen, was zu Verwirrung führen wird. (Crockford ist ein „Gewissensprogrammierer“, ähnlich dem „Gewissenskünstler“, mit dem Russell Wittgenstein verglich. Dieser Satz ist sehr schwer auszusprechen)

Funktionsdeklaration

function f() {}
Nach dem Login kopieren

scheint die Abkürzung von

var f = function f(){};
Nach dem Login kopieren

zu sein. Erstellen Sie für den Ausdruck

var a = function b(){};
Nach dem Login kopieren
Nach dem Login kopieren


eine Funktion, weisen Sie das integrierte Namensattribut „b“ zu und weisen Sie diese Funktion dann der Variablen a zu Der Aufruf erfolgt extern mit a(), aber b() kann nicht verwendet werden. Da die Funktion a zugewiesen wurde, wird eine Variable b nicht automatisch erstellt, es sei denn, Sie deklarieren eine Variable b mit var b = a. Natürlich ist der Name dieser Funktion „b“, nicht „a“.

Mit dem Funktionskonstruktor können auch Funktionen erstellt werden:

var f = new Function("a,b,c","return a+b+c;");
Nach dem Login kopieren


Diese Methode ist tatsächlich global Generieren Sie eine anonyme Funktion im Bereich und weisen Sie sie der Variablen f zu.

2. Rekursive Aufrufe

Rekursion wird zur Vereinfachung vieler Probleme verwendet, die einen Aufruf in einem Funktionskörper erfordern:

// 一个简单的阶乘函数
var f = function (x) {
  if (x === 1) {
    return 1;
  } else {
    return x * f(x - 1);
  }
};
Nach dem Login kopieren


Die große Flexibilität von Funktionen in Javascript führt zu Schwierigkeiten bei der Verwendung von Funktionsnamen bei der Rekursion. Für die obige Variablendeklaration ist f eine Variable, daher kann ihr Wert leicht ersetzt werden:

var fn = f;
f = function () {};
Nach dem Login kopieren

Numerischer Wert, aber da die Variable f immer noch innerhalb der Funktion referenziert wird, kann sie nicht richtig funktionieren.


Funktionsdeklaration sieht besser aus, ist aber schade:


Achten Sie nach der Definition einer rekursiven Funktion darauf, den Namen der Variablen nicht leicht zu ändern.

Was wir oben besprochen haben, sind alle Funktionsaufrufe. Es gibt andere Möglichkeiten, Funktionen aufzurufen, beispielsweise als Objektmethoden.
function f(x) {
  if (x === 1) {
    return 1;
  } else {
    return x * f(x - 1);
  }
}
var fn = f;
f = function () {}; // may been warning by browser
fn(5); // NaN
Nach dem Login kopieren

Wir deklarieren oft Objekte wie folgt:




Deklarieren Sie eine anonyme Funktion und weisen Sie sie dem Objekt zu Eigenschaften(fac).

Wenn wir hier eine Rekursion schreiben wollen, müssen wir die Eigenschaft selbst zitieren:
var obj1 = {
  num : 5,
  fac : function (x) {
    // function body
  }
};
Nach dem Login kopieren



Natürlich tritt auch das gleiche Problem auf wie bei der Funktionsaufrufmethode:

var obj1 = {
  num : 5,
  fac : function (x) {
    if (x === 1) {
      return 1;
    } else {
      return x * obj1.fac(x - 1);
    }
  }
};
Nach dem Login kopieren


Nachdem die Methode dem fac-Attribut von zugewiesen wurde obj2, die interne Referenz obj1.fac, also... fehlgeschlagen.

Eine andere Möglichkeit wird verbessert:
var obj2 = {fac: obj1.fac};
obj1 = {};
obj2.fac(5); // Sadness
Nach dem Login kopieren



Erhalten Sie die Ausführungszeit der Funktion über dieses Schlüsselwort Attribute im Kontext, sodass bei der Ausführung von obj2.fac das fac-Attribut von obj2 innerhalb der Funktion referenziert wird.

Die Funktion kann aber auch durch willkürliche Änderung des Kontexts aufgerufen werden, also durch den universellen Aufruf und die Anwendung:
var obj1 = {
   num : 5,
   fac : function (x) {
    if (x === 1) {
      return 1;
    } else {
      return x * this.fac(x - 1);
    }
  }
};
var obj2 = {fac: obj1.fac};
obj1 = {};
obj2.fac(5); // ok
Nach dem Login kopieren



Die rekursive Funktion kann also nicht wieder richtig funktionieren.

Wir sollten versuchen, dieses Problem zu lösen. Erinnern Sie sich an die zuvor erwähnte Funktionsdeklarationsmethode?
obj3 = {};
obj1.fac.call(obj3, 5); // dead again
Nach dem Login kopieren
var a = function b(){};
Nach dem Login kopieren
Nach dem Login kopieren


这种声明方式叫做内联函数(inline function),虽然在函数外没有声明变量b,但是在函数内部,是可以使用b()来调用自己的,于是

var fn = function f(x) {
  // try if you write "var f = 0;" here
  if (x === 1) {
    return 1;
  } else {
    return x * f(x - 1);
  }
};
var fn2 = fn;
fn = null;
fn2(5); // OK
Nach dem Login kopieren

// here show the difference between "var f = function f() {}" and "function f() {}"
var f = function f(x) {
  if (x === 1) {
    return 1;
  } else {
    return x * f(x - 1);
  }
};
var fn2 = f;
f = null;
fn2(5); // OK
Nach dem Login kopieren

var obj1 = {
  num : 5,
  fac : function f(x) {
    if (x === 1) {
      return 1;
    } else {
      return x * f(x - 1);
    }
  }
};
var obj2 = {fac: obj1.fac};
obj1 = {};
obj2.fac(5); // ok
  
var obj3 = {};
obj1.fac.call(obj3, 5); // ok
Nach dem Login kopieren


就这样,我们有了一个可以在内部使用的名字,而不用担心递归函数被赋值给谁以及以何种方式被调用。

Javascript函数内部的arguments对象,有一个callee属性,指向的是函数本身。因此也可以使用arguments.callee在内部调用函数:

function f(x) {
  if (x === 1) {
    return 1;
  } else {
    return x * arguments.callee(x - 1);
  }
}
Nach dem Login kopieren

   


但arguments.callee是一个已经准备被弃用的属性,很可能会在未来的ECMAscript版本中消失,在ECMAscript 5中"use strict"时,不能使用arguments.callee。

最后一个建议是:如果要声明一个递归函数,请慎用new Function这种方式,Function构造函数创建的函数在每次被调用时,都会重新编译出一个函数,递归调用会引发性能问题——你会发现你的内存很快就被耗光了。


Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript Dec 17, 2023 pm 02:54 PM

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen Dec 17, 2023 pm 05:30 PM

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Dec 17, 2023 pm 12:09 PM

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript Dec 17, 2023 am 09:39 AM

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Dec 17, 2023 pm 05:13 PM

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

So verwenden Sie insertBefore in Javascript So verwenden Sie insertBefore in Javascript Nov 24, 2023 am 11:56 AM

Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Bildverarbeitungssystems Dec 17, 2023 am 08:41 AM

JavaScript ist eine in der Webentwicklung weit verbreitete Programmiersprache, während WebSocket ein Netzwerkprotokoll für die Echtzeitkommunikation ist. Durch die Kombination der leistungsstarken Funktionen beider können wir ein effizientes Echtzeit-Bildverarbeitungssystem erstellen. In diesem Artikel wird erläutert, wie dieses System mithilfe von JavaScript und WebSocket implementiert wird, und es werden spezifische Codebeispiele bereitgestellt. Zunächst müssen wir die Anforderungen und Ziele des Echtzeit-Bildverarbeitungssystems klären. Angenommen, wir haben ein Kameragerät, das Bilddaten in Echtzeit sammeln kann

See all articles