2016-04-15 14 views
0

私はIIFEの目的がグローバルスコープから外れることを理解しています。IIFEで宣言された変数はどこにありますか?

/* avoid */ 
// logger.js 
angular 
    .module('app') 
    .factory('logger', logger); 

// logger function is added as a global variable 
function logger() { } 

// storage.js 
angular 
    .module('app') 
    .factory('storage', storage); 

// storage function is added as a global variable 
function storage() { } 

、代わりにこの操作を行います:私はこれは私がコントローラにいくつかの時間を呼び出すためのストレージ機能が利用できるようにすると仮定してい

/** 
* recommended 
* 
* no globals are left behind 
*/ 

// logger.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('logger', logger); 

    function logger() { } 
})(); 

// storage.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('storage', storage); 

    function storage() { } 
})(); 

をアンギュラスタイルguideでは、これを避けるために言います後で...それはグローバルな範囲にない場合は正確にどこですか?

+0

は角使ったことがないのに役立ちます願っていますが、APIの文言は、あなたがに工場として 'storage'を拘束しまし示唆'角型 'または' app'と呼ばれる何らかの種類のオブジェクトであり、潜在的に別名 'storage''でアクセス可能にしました。 – Marty

+0

@Marty Hmm ...私はそれが理にかなっていると思う。その場合、ファクトリにストレージ機能へのアクセス権が与えられますが、他には何もありません。 – PDN

答えて

2

IIFE Immediately Invoked Function Expressionの目的は、独立した実行スコープを作成するコードをモジュール化することです。 Angularには、指定された要素(工場、サービス、コントローラ、指令など)が登録され、場所に関係なく注入によって使用できるDependency Injectionシステムがあります。これは角度のFWによってあなたに提供されます。 Angularは暗黙の明示的な注入を持っています。

暗黙的な注入では、関数のパラメータ名を使用して、注入する依存関係を自動的に検出します。これは開発には適していますが、縮小された醜悪なコードが壊れてしまいます。良い情報には、あなたの明示的な注入を明示的に、すなわちアノテーションに変換できるツールがあります。あなたが実際に彼らの登録名で、配列を通過することになっているパラメータのリストを提供して、関数の引数でそれらを一致させる場所を明示モードがある

// storage.js 
(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .factory('storage',storage); 

    function storage(logger) { 
    // use logger 
    } 
})(); 

のようなあなたの暗黙の注射コードが見えるでしょう。あなたのコードは、明示的な注射で次のようになり

// storage.js 
(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .factory('storage', ['logger',storage]); 

    function storage(logger) { 
    // use logger 
    } 
})(); 

または

angular 
    .module('app') 
    .factory('storage', storage); 
    storage.$inject = ['logger']; 

    function storage(logger) { 
    // use logger 
    } 

私はこれが

+0

それでは、あとで私は記憶を暗黙に/明示的に注入できると言っていますか?私はストレージ機能がどこに保存されているのか聞いていたと思いますが、Martyのコメントは私の理解に役立ちました。あなたの答えはとても有益な拡張です! – PDN

+0

記憶機能は角度のDIシステムによって参照されます。重要なことは重要ではありません。インジェクションした場合、またはアプリケーション$ injectorを使ってリクエストした場合は、角度コードのどこからでも参照できるということです –

関連する問題