Warum müssen Sie eine anonyme Funktion in derselben Zeile aufrufen?

Lesezeit: 10 Minuten

Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
palig

Ich habe einige Beiträge über Schließungen gelesen und dies überall gesehen, aber es gibt keine klare Erklärung, wie es funktioniert – jedes Mal, wenn mir einfach gesagt wurde, ich solle es verwenden …:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

Ok, ich sehe, dass wir eine neue anonyme Funktion erstellen und dann ausführen werden. Danach sollte dieser einfache Code funktionieren (und das tut er auch):

(function (msg){alert(msg)})('SO');

Meine Frage ist, welche Art von Magie passiert hier? Das dachte ich mir, als ich schrieb:

(function (msg){alert(msg)})

dann würde eine neue unbenannte Funktion wie die Funktion “” (msg) erstellt …

aber warum geht das dann nicht?

(function (msg){alert(msg)});
('SO');

Warum muss es in der gleichen Zeile sein?

Könnten Sie mir bitte einige Beiträge zeigen oder mir eine Erklärung geben?

  • In anderen Sprachen werden diese als Funktionszeiger oder Delegierte bezeichnet, wenn Sie sich die beteiligten untergeordneten Strukturen ansehen möchten.

    – Chris Moschini

    16. November 2011 um 15:15 Uhr

  • Du hast ein ; in der ersten Zeile

    – Oliver Ni

    29. November 2013 um 21:43 Uhr

  • Jetzt, da Sie wissen, wie es funktioniert … Verwenden Sie es nicht. Wir sollten hören Sie auf, anonyme Funktionen zu schreiben. Mit nur ein paar Zeichen mehr können wir unseren Funktionen einen echten Namen geben und das Debuggen von Javascript-Code so viel einfacher machen!

    – Stijn de Witt

    14. Mai 2014 um 7:55 Uhr

  • Die Linie (function (msg){alert(msg)})('SO'); funktioniert komplett von alleine. Es hat nichts mit der anderen anonymen Funktion zu tun, die Sie davor gepostet haben. Das sind zwei völlig getrennte anonyme Funktionen. Sie müssen eine anonyme Funktion sofort aufrufen, da sie keinen Namen hat und danach nicht mehr referenziert werden kann.

    – Tintenfisch

    25. März 2015 um 17:46 Uhr


Lassen Sie das Semikolon nach der Funktionsdefinition weg.

(function (msg){alert(msg)})
('SO');

Oben sollte funktionieren.

DEMO-Seite: https://jsfiddle.net/e7ooeq6m/

Ich habe diese Art von Muster in diesem Beitrag besprochen:

jQuery- und $-Fragen

BEARBEITEN:

Wenn Sie sich ansehen ECMA-Skriptspezifikation, gibt es drei Möglichkeiten, eine Funktion zu definieren. (Seite 98, Kapitel 13 Funktionsdefinition)

1. Verwendung des Funktionskonstruktors

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. Funktionsdeklaration verwenden.

function sum(a, b)
{
    return a + b;
}

alert(sum(10, 10)); //Alerts 20;

3. Funktionsausdruck

var sum = function(a, b) { return a + b; }

alert(sum(5, 5)); // alerts 10

Sie fragen sich also vielleicht, was der Unterschied zwischen Deklaration und Ausdruck ist?

Aus der ECMA-Skriptspezifikation:

FunctionDeclaration : Funktionsbezeichner ( FormalParameterListopt ){ FunctionBody }

FunctionExpression : function Identifieropt ( FormalParameterListopt ){ FunctionBody }

Wenn Sie bemerken, ist “Identifikator”. Optional für Funktionsausdruck. Und wenn Sie keinen Bezeichner angeben, erstellen Sie eine anonyme Funktion. Das bedeutet nicht, dass Sie keinen Bezeichner angeben können.

Das bedeutet, dass Folgendes gilt.

var sum = function mySum(a, b) { return a + b; }

Wichtig zu beachten ist, dass Sie „mySum“ nur innerhalb des mySum-Funktionskörpers verwenden können, nicht außerhalb. Siehe folgendes Beispiel:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

Live-Demo

Vergleichen Sie dies mit

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

Lassen Sie uns mit diesem Wissen bewaffnet versuchen, Ihren Code zu analysieren.

Wenn Sie Code wie

    function(msg) { alert(msg); }

Sie haben einen Funktionsausdruck erstellt. Und Sie können diesen Funktionsausdruck ausführen, indem Sie ihn in Klammern setzen.

    (function(msg) { alert(msg); })('SO'); //alerts SO.

  • Ja, aber warum? Warum muss es als Inline sein? Egal wie viele Leerzeichen ich verwenden werde.

    – palig

    16. Juli 2009 um 20:30 Uhr

  • Wie ich schrieb, beendete das Semikolon die anonyme Funktionsdefinition. Da es keinen Namen hat (es ist anonym, duh!), können Sie es nicht mehr anrufen. Wenn Sie kein Semikolon setzen, kann die Funktion trotzdem ausgeführt werden.

    – LösungYogi

    16. Juli 2009 um 20:32 Uhr

  • Ich dachte, dass das automatische Einfügen von Semikolons in diesem Fall ein Semikolon einfügen würde, aber das tut es nicht. Du hast also Recht.

    – Nosredna

    16. Juli 2009 um 20:49 Uhr

  • Nosredna, JS verhält sich beim Hinzufügen von Semikolons wenig willkürlich. Lesen Sie diesen ausführlichen Artikel: blog.boyet.com/blog/javascriptlessons/…

    – LösungYogi

    16. Juli 2009 um 20:49 Uhr

  • Ja, das sehe ich (function (msg){alert(msg)})(‘SO’); funktioniert. Ich habe nur gefragt, warum es funktioniert. Wo dies angegeben ist oder um welche Art von JS-Funktion es sich handelt. Wenn ich also nur aufrufe: (function (msg){alert(msg)}) was passiert mit der Funktion? Es wird GC’ed?

    – palig

    16. Juli 2009 um 20:52 Uhr

Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
seth

Dies wird als selbstaufgerufene Funktion bezeichnet.

Was Sie tun, wenn Sie anrufen (function(){}) gibt ein Funktionsobjekt zurück. Beim Anhängen () dazu wird es aufgerufen und alles im Körper wird ausgeführt. Die ; bezeichnet das Ende der Anweisung, deshalb schlägt der 2. Aufruf fehl.

  • Ah ok, ich verstehe, also ist es nur eine spezielle JS-Syntax, richtig? Diese Erklärung gefällt mir am besten! Einfach und kurz 🙂

    – palig

    16. Juli 2009 um 20:40 Uhr

  • Ich denke, es ist falsch zu sagen, dass der Körper „evaluiert“ wird. Sie wird wie jede andere Funktion ausgeführt. Da es anonym ist, müssen Sie den Verweis entweder irgendwo speichern ODER sofort ausführen.

    – LösungYogi

    16. Juli 2009 um 20:45 Uhr

  • Ich persönlich mag den Begriff “selbstaufrufende Funktion” nicht einmal. Es ist nicht so, dass die Funktion sich selbst aufruft. Der Programmierer hat diese Klammern geschrieben, um sie aufzurufen.

    – LösungYogi

    16. Juli 2009 um 20:48 Uhr

  • Es ist keine “spezielle Syntax”, mehr als alles andere ist speziell. Tatsächlich ist die Form “Funktionsname (Argumente) { BLOCK }” viel “spezieller”. Es ist eigentlich unnötiger Zucker; Dies ist es jedoch, was die Dinge tatsächlich zum Laufen bringt.

    – Jrockweg

    16. Juli 2009 um 21:19 Uhr

  • schöner Link zum Artikel. Es wird darauf hingewiesen, warum jemand dieses Zitat verwenden würde: “Um das globale Objekt zu schützen, sollten alle JavaScript-Anwendungen innerhalb einer selbstaufrufenden Funktion geschrieben werden. Dadurch wird ein Anwendungsbereich geschaffen, in dem Variablen erstellt werden können, ohne befürchten zu müssen, dass sie kollidieren mit anderen Anwendungen.” Und auch bemerkt “Sobald die Funktion beendet ist, werden die Variablen verworfen und das globale Objekt bleibt unverändert.”

    – jadixon

    13. September 2013 um 18:36 Uhr


1646560522 324 Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
Benxamin

Eine Sache, die ich verwirrend fand, ist, dass die “()” Gruppierungsoperatoren sind.

Hier ist Ihre grundlegende deklarierte Funktion.

Ex. 1:

var message="SO";

function foo(msg) {
    alert(msg);
}

foo(message);

Funktionen sind Objekte und können gruppiert werden. Lassen Sie uns also Klammern um die Funktion werfen.

Ex. 2:

var message="SO";

function foo(msg) {  //declares foo
    alert(msg);
}

(foo)(message);     // calls foo

Anstatt die gleiche Funktion zu deklarieren und sofort aufzurufen, können wir jetzt eine einfache Substitution verwenden, um sie so zu deklarieren, wie wir sie nennen.

Ex. 3.

var message="SO";

(function foo(msg) {
    alert(msg);
})(message);          // declares & calls foo

Schließlich brauchen wir dieses zusätzliche Foo nicht, weil wir nicht den Namen verwenden, um es zu nennen! Funktionen können anonym sein.

Ex. 4.

var message="SO";

(function (msg) {   // remove unnecessary reference to foo
    alert(msg);
})(message);

Um Ihre Frage zu beantworten, beziehen Sie sich auf Beispiel 2. Ihre erste Zeile deklariert eine namenlose Funktion und gruppiert sie, ruft sie aber nicht auf. Die zweite Zeile gruppiert eine Zeichenfolge. Beides bringt nichts. (Vincents erstes Beispiel.)

(function (msg){alert(msg)});  
('SO');                       // nothing.

(foo); 
(msg); //Still nothing.

Aber

(foo)
(msg); //works

  • Danke. Ihre Beispiele waren ziemlich klar. Mir war nicht bewusst, dass Klammern in JavaScript die Bedeutung des Codes auf diese Weise ändern können. Ich habe einen Java-Hintergrund, daher lerne ich fast jeden Tag, an dem ich es verwende, etwas Neues (und oft Unerwartetes) über JavaScript.

    – hotshot309

    21. Juli 2011 um 3:03 Uhr

  • Danke, dass du es Schritt für Schritt gemacht hast, das ist viel besser als jede andere Erklärung, die ich gesehen habe. +1

    – Wk_of_Angmar

    25. Dezember 2012 um 2:12 Uhr

  • Großer AHA-Moment hier – und danke für die Illustration mit Substitution. +100

    – FredTheWebGuy

    7. September 2013 um 0:47 Uhr

  • Eine der besten Erklärungen, die ich über anonyme Funktionen gelesen habe. Vielen Dank!

    – Teknotika

    9. August 2014 um 11:20 Uhr

1646560523 182 Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
Vinzenz Robert

Eine anonyme Funktion ist keine Funktion mit dem Namen “”. Es ist einfach eine Funktion ohne Namen.

Wie jeder andere Wert in JavaScript muss für eine Funktion kein Name erstellt werden. Es ist jedoch weitaus nützlicher, ihn wie jeden anderen Wert tatsächlich an einen Namen zu binden.

Aber wie jeder andere Wert möchten Sie ihn manchmal verwenden, ohne ihn an einen Namen zu binden. Das ist das selbstaufrufende Muster.

Hier ist eine Funktion und eine Zahl, nicht gebunden, sie tun nichts und können niemals verwendet werden:

function(){ alert("plop"); }
2;

Wir müssen sie also in einer Variablen speichern, um sie wie jeden anderen Wert verwenden zu können:

var f = function(){ alert("plop"); }
var n = 2;

Sie können auch syntaktischen Zucker verwenden, um die Funktion an eine Variable zu binden:

function f(){ alert("plop"); }
var n = 2;

Aber wenn die Benennung nicht erforderlich ist und zu mehr Verwirrung und weniger Lesbarkeit führen würde, könnten Sie sie einfach sofort verwenden.

(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5

Hier sind meine Funktion und meine Zahlen nicht an eine Variable gebunden, können aber trotzdem verwendet werden.

So gesehen sieht es so aus, als hätten selbstaufrufende Funktionen keinen wirklichen Wert. Beachten Sie jedoch, dass das JavaScript-Bereichstrennzeichen die Funktion und nicht der Block ({}) ist.

Eine selbstaufrufende Funktion hat also tatsächlich die gleiche Bedeutung wie ein C++-, C#- oder Java-Block. Das bedeutet, dass die darin erstellte Variable nicht außerhalb des Gültigkeitsbereichs “leckt”. Dies ist in JavaScript sehr nützlich, um den globalen Geltungsbereich nicht zu verschmutzen.

1646560524 641 Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
jrockweg

So funktioniert JavaScript. Sie können eine benannte Funktion deklarieren:

function foo(msg){
   alert(msg);
}

Und nenne es:

foo("Hi!");

Oder Sie können eine anonyme Funktion deklarieren:

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

Und nenne das:

foo("Hi!");

Oder Sie können die Funktion einfach nie an einen Namen binden:

(function(msg){
   alert(msg);
 })("Hi!");

Funktionen können auch Funktionen zurückgeben:

function make_foo() {
    return function(msg){ alert(msg) };
}

(make_foo())("Hi!");

Es ist nichts wert, dass irgendwelche Variablen mit “var” im Hauptteil von definiert sind make_foo wird von jeder Funktion geschlossen, die von zurückgegeben wird make_foo. Dies ist ein Abschluss und bedeutet, dass jede Änderung, die von einer Funktion am Wert vorgenommen wird, von einer anderen sichtbar ist.

Auf diese Weise können Sie Informationen kapseln, wenn Sie dies wünschen:

function make_greeter(msg){
    return function() { alert(msg) };
}

var hello = make_greeter("Hello!");

hello();

So funktioniert fast jede Programmiersprache außer Java.

Der Code, den Sie zeigen,

(function (msg){alert(msg)});
('SO');

besteht aus zwei Aussagen. Der erste ist ein Ausdruck, der ein Funktionsobjekt ergibt (das dann der Garbage Collection unterzogen wird, weil es nicht gespeichert wird). Der zweite ist ein Ausdruck, der eine Zeichenkette ergibt. Um die Funktion auf die Zeichenfolge anzuwenden, müssen Sie entweder die Zeichenfolge als Argument an die Funktion übergeben, wenn sie erstellt wird (was Sie auch oben zeigen), oder Sie müssen die Funktion tatsächlich in einer Variablen speichern, damit Sie dies können Wenden Sie es zu einem späteren Zeitpunkt in Ihrer Freizeit an. So:

var f = (function (msg){alert(msg)});
f('SO');

Beachten Sie, dass Sie durch das Speichern einer anonymen Funktion (einer Lambda-Funktion) in einer Variablen dieser effektiv einen Namen geben. Daher können Sie genauso gut eine reguläre Funktion definieren:

function f(msg) {alert(msg)};
f('SO');

1646560524 24 Warum mussen Sie eine anonyme Funktion in derselben Zeile aufrufen
Gemeinschaft

Zusammenfassend zu den bisherigen Kommentaren:

function() {
  alert("hello");
}();

wenn sie keiner Variablen zugewiesen wird, ergibt sich ein Syntaxfehler. Der Code wird als Funktionsanweisung (oder Definition) analysiert, wodurch die schließenden Klammern syntaktisch falsch dargestellt werden. Das Hinzufügen von Klammern um den Funktionsteil teilt dem Interpreter (und Programmierer) mit, dass dies ein Funktionsausdruck (oder Aufruf) ist, wie in

(function() {
  alert("hello");
})();

Dies ist eine selbstaufrufende Funktion, d. h. sie wird anonym erstellt und sofort ausgeführt, da der Aufruf in derselben Zeile erfolgt, in der sie deklariert wurde. Diese selbstaufrufende Funktion wird mit der vertrauten Syntax zum Aufrufen einer Funktion ohne Argumente plus hinzugefügten Klammern um den Namen der Funktion angezeigt: (myFunction)();.

Es gibt eine gute SO-Diskussion JavaScript-Funktionssyntax.

955030cookie-checkWarum müssen Sie eine anonyme Funktion in derselben Zeile aufrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy