2016-05-07 9 views
3

currenlty ich die folgende Grund haben IIFE in JavaScript:Wie übergebe ich Service zu einem IIFE?

var myService = new Service(); //code omitted but its a service class that gets data 
var myTest = Test(myService); 

Die oben nicht funktioniert:

var Test = (function(service){ 
    var me = this; 
    me.service = service; 
    var my = {}; 
    my.getData1 = function(){ 
    return me.service.GetData1(); 
    } 
    my.getData2 = function(){ 
    return me.service.GetData2(); 
    } 

    return my; 

}()); 

Was würde ich in der Lage sein möchte Folgendes zu tun ist. Die Linie var myTest = Test(myService); wirft einen Fehler:

Test is not a function

Ich weiß auch, dass in einem IIFE, ein in Werten übergeben muss, weil es ist sofort aufgerufen, so dass die letzte Zeile sollte wie etwas sein:

}(service));

I kann diesen Code arbeiten lassen wenn ich nur entfernen Test wird die globale Variable halten die IIFE und stattdessen machen es eine globale Funktion mit dem fol Muhen Unterschrift:

function Test(service) {}

Aber ich bin mit einem IIFE zu versuchen und zu verhindern, dass die globale Reichweite zu verschmutzen. Ist es möglich, dass ich es immer noch verwenden kann, wie ich es entworfen habe, und eine Instanz meiner Service später an Test weiterleiten? Oder kann es nur eine IIFE sein, wenn alle seine Eingänge aufgelöst werden, wenn es aufgerufen wird und daher Werte nicht übergeben werden können (oder muss ich service einen Parameter für jede Methode in der IIFE, die es erfordert) machen?

Ich versuchte zu verhindern, dass der Dienst für jede Methode übergeben werden musste. Wenn es möglich ist, möchte ich die Dienstinstanz weiterreichen, aber vielleicht ist mein Verständnis nicht korrekt. Bitte korrigieren Sie mich, wenn es so ist.

+3

Warum der IIFE und nicht nur ein normaler Konstruktor, der den Dienst übernimmt? "Ich benutze ein IIFE, um zu versuchen, den globalen Geltungsbereich zu verschmutzen." Es gibt keinen Unterschied ... "Test" wird weiterhin global sein. – plalx

+0

@plalx - Ich bin tatsächlich an Ihrem Vorschlag interessiert. Das Problem, auf das ich gestoßen bin, ist, wenn ich 'function Test (service) {this.myService = service'} als Konstruktor habe und später versuche, es zu benutzen, wie' var result = this.carservice.GetData1(); ' Innerhalb einer Methode wie 'my.getData1', bekomme ich eine' Kann Eigenschaft 'GetData1' von 'undefined' nicht lesen.Ich denke, das liegt daran, dass "das" an das erstellte Objekt gebunden ist und nicht so funktioniert, wie ich es hatte. Ich habe eine Problemumgehung, wo ich 'this' zu einer anderen Variablen wie 'var me = this 'zuweisen. Was denken Sie? – atconway

+0

@plalx - macht nichts, wahrscheinlich überlegte es. Einfach den Service übergeben und direkt in den Anrufen verwenden. Keine Notwendigkeit, um zu übertragen, wie unten erwähnt. Die Verwendung direkt in den Methoden nach dem Übergeben in den Konstruktor funktioniert. – atconway

Antwort

5

Wenn Sie vermeiden möchten, den globalen Geltungsbereich zu verschmutzen, sollten Sie wrap Ihren Code in einem IIFE, nicht konvertieren Sie Ihre Funktionen zu IIFEs. Das ist nutzlos und dann können Sie sie höchstwahrscheinlich nicht anrufen.

(function() { 
    var Test = function(service){ 
    var my = {}; 
    my.getData1 = function(){ 
     return service.GetData1(); 
    } 
    my.getData2 = function(){ 
     return service.GetData2(); 
    } 
    return my; 
    }; 
    var myService = new Service(); 
    var myTest = Test(myService); 
})(); 

Beachten Sie, dass, wenn Sie Test(myService) nennen, die this Wert wird das globale Objekt in schlampig Modus oder undefiniert im Strict-Modus sein. So me.service = service wird entweder den globalen Bereich verschmutzen oder einen Fehler werfen. Entfernen Sie das einfach, oder instanziieren Sie statt Anruf: new Test(myService).

+1

Nur eine Randnotiz, aber IIFEs sind meistens am Anfangspunkt der Kompositionswurzel oder der Anwendung nützlich, aber ich würde dort keine Objekte deklarieren, solange Sie kein Modul offen legen. Im Moment könnten Sie Test nicht überall wiederverwenden. – plalx

2

Ein IIFE wird die Funktion ausführen. Da Ihre Funktion my zurückgibt, setzen Sie effektiv den Wert Test auf my, dh (Test=my). Sie wollen Test eine Funktion halten, nicht ihr Ergebnis. Sie könnten so etwas tun

var Test = function (someArg) { 
    return function (someArg) { 
     console.log(someArg); 
    }; 
}; 
(Test())(12); //logs 12