391 Stimmen

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

Ich habe einige Beiträge über Verschlüsse gelesen und dies überall gesehen, aber es gibt keine klare Erklärung, wie es funktioniert - jedes Mal wurde mir nur gesagt, dass ich es benutzen soll...:

// 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 diese dann ausführen werden. Danach sollte dieser einfache Code also funktionieren (und das tut er auch):

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

Meine Frage ist: Welche Art von Magie geschieht hier? Das dachte ich, als ich schrieb:

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

dann würde eine neue unbenannte Funktion wie function ""(msg) ... erstellt werden.

aber warum funktioniert das dann nicht?

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

Warum muss sie in der gleichen Zeile stehen?

Könnten Sie mir bitte einige Stellen nennen oder mir eine Erklärung geben?

1voto

Oliver Ni Punkte 2479

Als du es getan hast:

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

Sie haben die Funktion beendet, bevor ('SO') wegen des Semikolons. Wenn Sie einfach schreiben:

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

Es wird funktionieren.

Arbeitsbeispiel: http://jsfiddle.net/oliverni/dbVjg/

1voto

Der einfache Grund dafür, dass es nicht funktioniert, liegt nicht an der ; was das Ende der anonymen Funktion anzeigt. Das liegt daran, dass ohne die () am Ende eines Funktionsaufrufs, handelt es sich nicht um einen Funktionsaufruf. Das heißt,

function help() {return true;}

Wenn Sie anrufen result = help(); Dies ist ein Aufruf einer Funktion und gibt true zurück.

Wenn Sie anrufen result = help; dies ist kein Anruf. Es handelt sich um eine Zuweisung, bei der die Hilfe wie Daten behandelt wird, die dem Ergebnis zugewiesen werden.

Sie haben eine anonyme Funktion deklariert/instantiiert, indem Sie das Semikolon hinzugefügt haben,

(function (msg) { /* Code here */ });

und dann versucht, sie in einer anderen Anweisung aufzurufen, indem ich nur Klammern verwende... Offensichtlich, weil die Funktion keinen Namen hat, aber das wird nicht funktionieren:

('SO');

Der Interpreter sieht die Klammern in der zweiten Zeile als eine neue Anweisung, und deshalb funktioniert es nicht, auch wenn Sie es so gemacht haben:

(function (msg){/*code here*/});('SO');

Es funktioniert immer noch nicht, aber es funktioniert, wenn Sie das Semikolon entfernen, weil der Interpreter Leerzeichen und Zeilenumbrüche ignoriert und den gesamten Code als eine Anweisung betrachtet.

(function (msg){/*code here*/})        // This space is ignored by the interpreter
('SO');

Fazit: Ein Funktionsaufruf ist kein Funktionsaufruf ohne die () am Ende, es sei denn unter bestimmten Bedingungen, z. B. wenn sie von einer anderen Funktion aufgerufen wird, d. h. onload='help' würde die Hilfefunktion ausführen, obwohl die Klammern nicht enthalten waren. Ich glaube, dass setTimeout und setInterval auch diese Art von Funktionsaufruf erlauben, und ich glaube auch, dass der Interpreter die Klammern hinter den Kulissen sowieso hinzufügt, was uns wieder zu "ein Funktionsaufruf ist kein Funktionsaufruf ohne Klammern" bringt.

1voto

capu Punkte 1697

Eine andere Sichtweise

Zunächst können Sie eine anonyme Funktion deklarieren:

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

Dann rufen Sie es an:

foo ('Few');

Denn foo = function(msg){alert(msg);} Sie können also ersetzen foo als:

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

Sie sollten jedoch Ihre gesamte anonyme Funktion in ein Paar geschweifte Klammern einschließen, um Syntaxfehler bei der Deklaration der Funktion beim Parsen zu vermeiden. Dann haben wir,

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

Auf diese Weise ist es für mich leicht zu verstehen.

-1voto

Vietnhi Phuvan Punkte 2504

Anonyme Funktionen sind für einmalige Aktionen gedacht, bei denen Sie eine Funktion spontan so definieren, dass sie aus einer von Ihnen bereitgestellten Eingabe eine Ausgabe erzeugt. Allerdings haben Sie die Eingabe nicht bereitgestellt. Stattdessen haben Sie in der zweiten Zeile etwas geschrieben ('SO'); - eine unabhängige Anweisung, die nichts mit der Funktion zu tun hat. Was haben Sie erwartet? :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X