2016-08-04 19 views
2

ich diesen Code haben und sich fragen, wie können wir Zugriff auf Eigenschaften und Verfahren von IIFEJavascript: Wie Eigenschaften und Verfahren von IIFE zuzugreifen

var app = (function() { 
    function app() { 
     this.name = 'fasf'; 
    } 
    app.prototype.greeting = function() { 
     this.a = 'hello world'; 
     console.log(name); 
     window.alert('hello world'); 
    }; 
    app.prototype.sayhello = function() { 
     var j = 't'; 
     console.log(this.a); 
    }; 
    return app; 
}()); 

auch über dieses Stück Code

var t = (function greet(name){ 
    name = name || 'enter your name' 
    console.log('Hello ' + name); 
})(); 
+1

Was meinen Sie Eigenschaften und Methoden von IIFE? IIFE ist eine Funktion, die sofort aufgerufen wird, über die Eigenschaften und Methoden sprechen Sie. – Vishwanath

+0

Ein IEFE hat keine Eigenschaften und Methoden. Wenn überhaupt, hat es einen Rückgabewert, wie "app" in Ihrem ersten Snippet. – Bergi

Antwort

3

Mit dem Code, den Sie haben, können Sie dies nur tun:

// create an instance of the app object 
var a = new app(); 
// call methods on it 
a.greeting(); 
a.sayhello(); 

Ihre IIFE liefern den internen app Konstruktor Spaß ction und weist das dann einer Variablen namens app zu. Sie können dann new app() erstellen, um eine Instanz dieses Objekts zu erstellen. Sobald Sie eine Instanz dieses Objekts erstellt haben, können Sie eine der Methoden des Prototyps aufrufen.


In Ihrem zweiten IIFE wird nichts aus dem IIFE zurückgeführt, so ist t undefiniert.


Das IIFE selbst hat keine Eigenschaften und Methoden. Das ist nur ein sofort aufgerufener Funktionsausdruck. In Ihrer ersten gibt es eine Konstruktorfunktion zurück, die dann einer Variablen zugewiesen wird, so dass die Variable zum Erstellen von Objekten mit dieser Konstruktorfunktion verwendet werden kann. Es gibt keine Eigenschaften oder Methoden des IIFE selbst.

0

Die Art, wie das IIFE-Muster funktioniert, besteht darin, dass Sie lokale Variablen für die Dinge verwenden, die Sie privat halten wollen. Lokale Variablen sind nur innerhalb der Funktion sichtbar, in der sie definiert wurden. Sie können nicht von irgendwo anders im Programm gelesen oder geschrieben werden.

Wenn Sie Dinge in dem IIFE außerhalb des IIFE einen Weg zu belichten ist über den Rückgabewert der unmittelbar aufgerufen Funktion zu tun:

var stuff = (function(){ 

    // These variables and functions are not 
    // visible from the outside: 

    var myvar1 = "Hello"; 
    var myvar2 = "World"; 

    var func1(){ 
     return myvar1 + " " + myvar2; 
    } 

    // But we can return a record that contains a 
    // reference to our private functions, making them 
    // visible outside this block. 
    return { 
     thefunc: func1 
    } 

}()); 

//Now we can call the "thefunc" function we exported 
console.log(stuff.thefunc()); 

ich sicher gemacht keine Variablennamen zu wiederholen, um Verwirrung vermeiden.

In Ihrem ersten Beispiel gibt es wenig Sinn, das IIFE-Muster zu verwenden, da es keine lokalen Variablen gibt, die Sie privat machen. Sie hätten einfach die app Funktion außerhalb des IIFE definieren können und es hätte genauso funktioniert.

function greet(name){ 
    name = name || 'enter your name' 
    console.log('Hello ' + name); 
} 
var t = greet(); 

Nicht nur ist es ein bisschen komisch, sofort eine benannte Funktion aufrufen, aber in Ihrem speziellen Beispiel die ":

Der zweite Fall könnte, indem die Funktion in einer separaten Zeile wurden deutlicher geschrieben Standard-Argument Wert "Muster schlägt vor, dass diese Funktion entworfen wurde, um mehrmals aufgerufen werden, manchmal übergeben das" Name "Argument und manchmal nicht übergeben (in diesem Fall ist standardmäßig die Zeichenfolge" geben Sie Ihren Namen "ein.

0

Bei der Verwendung IIFE-Muster (Schließung) Sie behalten in der Regel lokale Variablen und Funktion privat wie erwähnt durch Umarmung OMGs Antwort.

Für den Fall, dass Sie eine bestimmte Eigenschaft selektiv veröffentlichen möchten, können Sie stattdessen "The Revealing Module Pattern" verwenden, more info here.

Im Folgenden ein einfaches Beispiel zeigt dieses Muster:

var app = (function() { 
 
    
 
     var privateVar = 'hello world'; 
 
    
 
     function sayhelloPrivate() { 
 
      console.log(privateVar); 
 
     } 
 
    
 
     function sayhelloPublic() { 
 
      console.log(privateVar); 
 
     } 
 
    
 
     // reveal public pointers to 
 
     // private functions and properties 
 
    
 
     return { 
 
      sayhello : sayhelloPublic 
 
     }; 
 

 
    })(); 
 
    
 
app.sayhello(); 
 
//app.sayhelloPrivate(); this will not work as function is private and not visible outside module