2016-07-16 7 views
-1

Ich habe folgenden Code erhalten, indem ich einige Änderungen an der kompilierten Version von Typoskript-Code einer Demoklasse vorgenommen habe.neuer Operator auf eingeklammerte Klammerfunktion (IIFE)

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = (f)(); 
console.log("Creating instance"); 
var demo = new Demo(); 

// Output 
// Creating instance 
// Inside constructor 

Nach dem Entfernen von IIFE ich bekam,

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = f; 
console.log("Creating instance"); 
var demo = new Demo(); 

// Output 
// Creating instance 

Im ersten Fall, der Konstruktor auf dem Aufruf von Demo ausgeführt. Im zweiten Fall führte das Aufrufen von Demo keinen Konstruktor aus. Wie verhält sich der Operator new in jedem Fall?

+2

Es geht nicht um 'new' Schlüsselwort, geht es um' var Demo = (f)(); '' vs var Demo = f; ' – Rayon

Antwort

3

var Demo = (f)(); ist das gleiche wie var Demo = f();. Sie Anruff und den Rückgabewert zuweisen (die Demo-Funktion) Demo).

var Demo = f; weist die f-Funktion Demo zu.

Der new Operator verhält sich auf die gleiche Weise, Sie wenden ihn nur auf andere Werte an.


Nach dem Entfernen von IIFE

Es gibt keine IIFE hier überhaupt nicht.

Ein IIFE ist, wo Sie einen Funktionsausdruck haben (Sie haben nur Funktionsdeklarationen) und Sie folgen ihm sofort mit (), um es aufzurufen.

Sie haben eine Funktion (f), die Sie entweder anrufen oder nicht anrufen.

1

Sie haben kein IIFE entfernt, Sie haben einfach einen Funktionsaufruf entfernt (f() in f).

Eine korrekte Transformation würde aussehen wie:

Originalcode:

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = f(); 

Inline f:

var Demo = (function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
})(); 

Inline Demo (f zu einem einzelnen Ausdruck für den nächsten Schritt zu reduzieren):

var Demo = (function f() { 
    return function Demo() { 
     console.log("Inside constructor"); 
    }; 
})(); 

Entfernen IIFE (d.h. drehen function() { return ...; }() in ...):

var Demo = function Demo() { 
    console.log("Inside constructor"); 
};