2016-05-07 6 views
3

私はcurrenlty JavaScriptで、次の基本的なIIFEを持っている:上記IIFEにサービスを渡すには?

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

動作しません:以下れる私は何をできるようにしたいと思い

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; 

}()); 

。ラインvar myTest = Test(myService);でエラーが発生します:

}(service));

:それは はすぐを呼び出したので、最後の行のようなものであるべきであるので、

Test is not a function

は、私はまたIIFEでは、1に値を渡す必要があることを知っています

I を保持するグローバル変数であるTestを削除し、その代わりにfol署名をlowing:

function Test(service) {}

しかし、私は試してみて、グローバルスコープを汚染防止にIIFEを使用しています。私が設計し、Serviceのインスタンスを後でTestに渡すことができますか?または、それが呼び出されたときにその入力がすべて解決された場合にのみ、IIFEにすることはできますか(または、serviceを必要とするIIFEのすべてのメソッドにパラメータを設定する必要がありますか?

私は各メソッドにサービスを渡す必要がないようにしようとしていました。可能であれば、私はサービスのインスタンスを渡したいと思いますが、おそらく私の理解は外されています。

+3

サービスを受け入れる通常のコンストラクタではなく、なぜIIFEですか? "私はIIFEを使って地球規模の汚染を防ぎしようとしています"違いはありません... "テスト"はまだグローバルになります。 – plalx

+0

@plalx - 私は実際にあなたの提案に興味があります。私が実行した問題は、 'function test(service){this.myService = service'}をコンストラクタとして使用し、後で' var result = this.carservice.GetData1(); 'のように使用しようとしています。 'my.getData1'のようなメソッドの中で、' Undefined'の 'GetData1 'プロパティを読み込めません。私はそれが、「これ」が作成されたオブジェクトに拘束されていて、私が持っていた方法では動作しないためだと思います。私は 'var me = this'のような別の変数に' this 'を代入する回避策があります。どう思いますか? – atconway

+0

@plalx - 気にしないでください。ちょうどサービスを渡し、コールで直接使用してください。下記のように転送する必要はありません。コンストラクタに渡した後、メソッド内で直接使用するだけで動作します。 – atconway

答えて

5

グローバルスコープを汚染しないようにするには、コードをIIFE内に置き、関数をIIFEに変換しないでください。それは役に立たず、おそらくあなたはそれらを呼び出すことはできません。

(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); 
})(); 

あなたがTest(myService)を呼び出す場合、this値はstrictモードでのずさんなモードまたは未定義でグローバルオブジェクトになることに注意してください。したがってme.service = serviceはグローバルスコープを汚染するか、エラーをスローします。それを削除するか、電話の代わりにnew Test(myService)をインスタンス化してください。

+1

ちょっとした注意ですが、IIFEはコンポジションルートまたはアプリケーションのエントリポイントで最も役に立ちますが、モジュールを公開しない限り、そこにオブジェクトを宣言しません。今すぐTestを再利用することはできません。 – plalx

2

IIFEがこの機能を実行します。あなたの関数はmyを返すので、Testの値をmy、つまり(Test=my)に設定するのが効果的です。 Testにはその結果ではなく、関数を保持します。あなたはこのようなことをすることができます

var Test = function (someArg) { 
    return function (someArg) { 
     console.log(someArg); 
    }; 
}; 
(Test())(12); //logs 12 
関連する問題