Heim Web-Frontend js-Tutorial Anonyme Funktionen und Selbstausführung in Javascript

Anonyme Funktionen und Selbstausführung in Javascript

Oct 13, 2016 am 10:21 AM

Die Definition von Funktionen kann grob in drei Arten unterteilt werden:

Die erste: Dies ist auch die konventionellste

function double(x){    
    return 2 * x;       
}
Nach dem Login kopieren

Die zweite: Diese Methode verwendet den Funktionskonstruktor Sowohl die Parameterliste als auch der Funktionskörper als Zeichenfolgen, was sehr unpraktisch ist und nicht empfohlen wird.

var double = new Function('x', 'return 2 * x;');
Nach dem Login kopieren

Die dritte Methode:

var double = function(x) { return 2* x; }
Nach dem Login kopieren

Beachten Sie, dass die Funktion auf der rechten Seite von „=" eine anonyme Funktion ist. Nach dem Erstellen der Funktion wird die Funktion zugewiesen Variables Quadrat.

Erstellung anonymer Funktionen

Der erste Weg: Definieren Sie die Quadratfunktion wie oben erwähnt, was auch einer der am häufigsten verwendeten Wege ist.

Zweiter Weg:

(function(x, y){   
    alert(x + y);     
})(2, 3);
Nach dem Login kopieren

Hier wird eine anonyme Funktion erstellt (innerhalb der ersten Klammer), und die zweite Klammer wird verwendet, um die anonyme Funktion aufzurufen und die Parameter zu übergeben. Klammern sind Ausdrücke und Ausdrücke haben Rückgabewerte. Sie können also am Ende ein Klammerpaar hinzufügen, damit sie

Selbstausführende anonyme Funktion< ausführen 🎜 >

1. Was ist eine selbstausführende anonyme Funktion?

Es bezieht sich auf eine Funktion, die so aussieht: (function {// code})();

2 . Frage
Warum kann (function {// code})(); ausgeführt werden, aber function {// code}(); meldet einen Fehler?

3. Analyse
(1) Zunächst müssen wir den Unterschied zwischen den beiden verstehen:
(Funktion {// Code}) ist ein Ausdruck, Funktion {// Code} ist eine Funktionsdeklaration. . Zweitens ist js „vorkompiliert“. Funktionen:
In der „Vorkompilierungsphase“ interpretiert js Funktionsdeklarationen, ignoriert jedoch Ausdrücke (3). }();, da function() {//code} in der Phase „Vorkompilierung“ erklärt wurde, überspringt js function(){//code} und versucht, (); auszuführen, sodass ein Fehler auftritt gemeldet werden;
Wenn js ausgeführt wird, wenn (function {// code})();, da (function {// code}) ein Ausdruck ist, löst js ihn auf, um den Rückgabewert zu erhalten ist eine Funktion, die ausgeführt wird, wenn sie auf ();

stößt. Darüber hinaus ist die Methode zum Konvertieren einer Funktion in einen Ausdruck nicht unbedingt auf den Gruppierungsoperator () angewiesen Operator, ~-Operator, !-Operator...

Zum Beispiel:

Anonyme Funktionen und Schließungen

!function(){   
  alert("另类的匿名函数自执行");   
}();
Nach dem Login kopieren

Das englische Wort für Schließung ist Der Verschluss ist ein sehr wichtiger Teil der JavaScript-Kenntnisse, da die Verwendung von Verschlüssen die Menge unseres Codes erheblich reduzieren, unseren Code klarer aussehen lassen usw. Kurz gesagt, er ist sehr leistungsfähig.

Die Bedeutung des Abschlusses: Um es ganz klar auszudrücken: Der Abschluss ist die Verschachtelung von Funktionen. Die innere Funktion kann alle Variablen der äußeren Funktion verwenden, auch wenn die äußere Funktion ausgeführt wurde (dies beinhaltet die JavaScript-Bereichskette). ).

Dieses Beispiel sieht nach sorgfältiger Analyse des Ausführungsprozesses immer noch sehr einfach aus: Die Ausführung der checkClosure-Funktion erfolgt augenblicklich (vielleicht dauert sie nur 0,00001 Millisekunden). Nach der Ausführung von checkClosure wird str nicht freigegeben. Dies liegt daran, dass die anonyme Funktion in setTimeout einen Verweis auf str hat. Nach 2 Sekunden wird die anonyme Funktion im Funktionskörper ausgeführt und str freigegeben.

function checkClosure(){  
    var str = &#39;rain-man&#39;;  
    setTimeout(  
        function(){ alert(str); } //这是一个匿名函数  
    , 2000);  
}  
checkClosure();
Nach dem Login kopieren

Verwenden Sie Abschlüsse, um Code zu optimieren:

Anonyme Funktionen werden am häufigsten zum Erstellen von Abschlüssen verwendet (dies ist eine der Funktionen der JavaScript-Sprache). Außerdem können Namespaces erstellt werden, um die Verwendung globaler Variablen zu reduzieren.

function forTimeout(x, y){  
    alert(x + y);  
}  
function delay(x , y  , time){  
    setTimeout(&#39;forTimeout(&#39; +  x + &#39;,&#39; +  y + &#39;)&#39; , time);      
}  
/**  
 * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰  
 * function delay(x , y , time){  
 *     setTimeout(  
 *         function(){  
 *             forTimeout(x , y)   
 *         }            
 *     , time);     
 * }  
 */
Nach dem Login kopieren

In diesem Code sind die Funktionen addEvent und removeEvent lokale Variablen, aber wir können sie über die globale Variable oEvent verwenden, was die Verwendung globaler Variablen erheblich reduziert und die Sicherheit der Webseite erhöht. Wir möchten diesen Code verwenden: oEvent.addEvent(document.getElementById('box'), 'click', function(){});

var oEvent = {};  
(function(){   
    var addEvent = function(){ /*代码的实现省略了*/ };  
    function removeEvent(){}  
     
    oEvent.addEvent = addEvent;  
    oEvent.removeEvent = removeEvent;  
})();
Nach dem Login kopieren

Hier erstellen wir eine Variable Rainman und initialisieren sie mit 5 durch direkten Aufruf der anonymen Funktion. Dieser kleine Trick ist manchmal sehr praktisch.

var rainman = (function(x , y){  
    return x + y;  
})(2 , 3);  
/**  
 * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。  
 * var rainman = function(x , y){  
 *    return x + y;  
 * }(2 , 3);
Nach dem Login kopieren

Die Variable eins in diesem Code ist eine lokale Variable (da sie innerhalb einer Funktion definiert ist) und daher von außen nicht zugänglich. Aber hier haben wir die innere Funktion erstellt, die auf die Variable eins zugreifen kann, und die globale Variable äußere bezieht sich auf inner, sodass ein dreimaliger Aufruf von äußere das inkrementelle Ergebnis anzeigt.

var outer = null;  
     
(function(){  
    var one = 1;  
    function inner (){  
        one += 1;  
        alert(one);  
    }  
    outer = inner;  
})();  
     
outer();    //2  
outer();    //3  
outer();    //4
Nach dem Login kopieren

Hinweis

1 Durch den Abschluss kann die innere Funktion auf die Variable in der übergeordneten Funktion verweisen, die Variable jedoch Endwert

Sie werden feststellen, dass, wenn die Maus über jedes

-Element bewegt wird, immer 4 angezeigt wird, nicht der Elementindex, den wir erwarten. Warum ist das so? Es ist bereits in den Anmerkungen erwähnt (Endwert). Offensichtlich ist diese Erklärung zu einfach. Wenn das Mouseover-Ereignis die Listening-Funktion aufruft, sucht es zunächst innerhalb der anonymen Funktion (function(){ Alert(i); }), um zu sehen, ob i definiert ist Daher wird nach oben gesucht. Das Ergebnis ist, dass es definiert wurde und der Wert von i 4 ist (der i-Wert nach der Schleife erscheint daher jedes Mal).
/**  
 * <body>  
 * <ul>  
 *     <li>one</li>  
 *     <li>two</li>  
 *     <li>three</li>  
 *     <li>one</li>  
 * </ul>  
 */
     
var lists = document.getElementsByTagName(&#39;li&#39;);  
for(var i = 0 , len = lists.length ; i < len ; i++){  
    lists[ i ].onmouseover = function(){  
        alert(i);      
    };  
}
Nach dem Login kopieren

Lösung eins:

  • Lösung zwei:

    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0 , len = lists.length ; i < len ; i++){  
        (function(index){  
            lists[ index ].onmouseover = function(){  
                alert(index);      
            };                      
        })(i);  
    }
    Nach dem Login kopieren

    Lösung drei:

    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0, len = lists.length; i < len; i++){  
        lists[ i ].$$index = i;    //通过在Dom元素上绑定$$index属性记录下标  
        lists[ i ].onmouseover = function(){  
            alert(this.$$index);      
        };  
    }
    Nach dem Login kopieren

    2 Speicherverlust

    function eventListener(list, index){  
        list.onmouseover = function(){  
            alert(index);  
        };  
    }  
    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0 , len = lists.length ; i < len ; i++){  
        eventListener(lists[ i ] , i);  
    }
    Nach dem Login kopieren
    Die Verwendung von Schließungen kann leicht zu Speicherverlusten im Browser führen. In schwerwiegenden Fällen kann der Browser hängen bleiben.

  • 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

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    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)

    Wie erstelle ich meine eigenen JavaScript -Bibliotheken? Wie erstelle ich meine eigenen JavaScript -Bibliotheken? Mar 18, 2025 pm 03:12 PM

    In Artikel werden JavaScript -Bibliotheken erstellt, veröffentlicht und aufrechterhalten und konzentriert sich auf Planung, Entwicklung, Testen, Dokumentation und Werbestrategien.

    Wie optimiere ich den JavaScript -Code für die Leistung im Browser? Wie optimiere ich den JavaScript -Code für die Leistung im Browser? Mar 18, 2025 pm 03:14 PM

    In dem Artikel werden Strategien zur Optimierung der JavaScript -Leistung in Browsern erörtert, wobei der Schwerpunkt auf die Reduzierung der Ausführungszeit und die Minimierung der Auswirkungen auf die Lastgeschwindigkeit der Seite wird.

    Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Apr 04, 2025 pm 02:42 PM

    Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

    Wie debugge ich den JavaScript -Code effektiv mithilfe von Browser -Entwickler -Tools? Wie debugge ich den JavaScript -Code effektiv mithilfe von Browser -Entwickler -Tools? Mar 18, 2025 pm 03:16 PM

    In dem Artikel werden effektives JavaScript -Debuggen mithilfe von Browser -Entwickler -Tools, der Schwerpunkt auf dem Festlegen von Haltepunkten, der Konsole und der Analyse der Leistung erörtert.

    Wie verwende ich Quellkarten zum Debuggen, um den JavaScript -Code zu debuggen? Wie verwende ich Quellkarten zum Debuggen, um den JavaScript -Code zu debuggen? Mar 18, 2025 pm 03:17 PM

    In dem Artikel wird erläutert, wie Quellkarten zum Debuggen von JavaScript verwendet werden, indem er auf den ursprünglichen Code zurückgegeben wird. Es wird erläutert, dass Quellenkarten aktiviert, Breakpoints eingestellt und Tools wie Chrome Devtools und WebPack verwendet werden.

    Wie benutze ich Javas Sammlungsrahmen effektiv? Wie benutze ich Javas Sammlungsrahmen effektiv? Mar 13, 2025 pm 12:28 PM

    In diesem Artikel wird der effektive Gebrauch des Sammlungsrahmens von Java untersucht. Es betont die Auswahl geeigneter Sammlungen (Liste, Set, Karte, Warteschlange) basierend auf Datenstruktur, Leistungsanforderungen und Thread -Sicherheit. Optimierung der Sammlungsnutzung durch effizientes Gebrauch

    TypeScript für Anfänger, Teil 2: Grundlegende Datentypen TypeScript für Anfänger, Teil 2: Grundlegende Datentypen Mar 19, 2025 am 09:10 AM

    Sobald Sie das Typscript-Tutorial für Einstiegsklasse gemeistert haben, sollten Sie in der Lage sein, Ihren eigenen Code in eine IDE zu schreiben, die TypeScript unterstützt und in JavaScript zusammenfasst. Dieses Tutorial wird in verschiedenen Datentypen in TypeScript eingetaucht. JavaScript hat sieben Datentypen: NULL, UNDEFINED, BOOLEAN, NUMMER, STRING, SYMBOL (durch ES6 eingeführt) und Objekt. TypeScript definiert mehr Typen auf dieser Grundlage, und dieses Tutorial wird alle ausführlich behandelt. Null -Datentyp Wie JavaScript, null in TypeScript

    Erste Schritte mit Chart.js: Kuchen-, Donut- und Bubble -Diagramme Erste Schritte mit Chart.js: Kuchen-, Donut- und Bubble -Diagramme Mar 15, 2025 am 09:19 AM

    In diesem Tutorial wird erläutert, wie man mit Diagramm.js Kuchen-, Ring- und Bubble -Diagramme erstellt. Zuvor haben wir vier Chart -Arten von Charts gelernt. Erstellen Sie Kuchen- und Ringdiagramme Kreisdiagramme und Ringdiagramme sind ideal, um die Proportionen eines Ganzen anzuzeigen, das in verschiedene Teile unterteilt ist. Zum Beispiel kann ein Kreisdiagramm verwendet werden, um den Prozentsatz der männlichen Löwen, weiblichen Löwen und jungen Löwen in einer Safari oder den Prozentsatz der Stimmen zu zeigen, die verschiedene Kandidaten bei der Wahl erhalten. Kreisdiagramme eignen sich nur zum Vergleich einzelner Parameter oder Datensätze. Es ist zu beachten, dass das Kreisdiagramm keine Entitäten ohne Wert zeichnen kann, da der Winkel des Lüfters im Kreisdiagramm von der numerischen Größe des Datenpunkts abhängt. Dies bedeutet jede Entität ohne Anteil

    See all articles