2016-04-15 53 views
0

所以我明白一个IIFE的目的是让他们脱离全球范围。在角式的guide,它说要避免这种情况:在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() { } 
})(); 

我假设这使得存储功能可对我来说,控制器一些时间打电话后来...但是如果它不在全球范围内,究竟在哪里呢?

+0

从未使用过的角度,但API的措辞表明您已经绑定'storage'作为工厂'angular'或某种被称为'app'的对象,并可能使用别名'storage'来访问它。 – Marty

+0

@Marty嗯......我认为这是有道理的。在这种情况下,它会让工厂访问存储功能,但没有其他的权利? – PDN

回答

2

IIFE立即调用函数表达式的目的是模块化您的代码创建独立的执行范围。 Angular有一个依赖注入系统,其中指定的元素(工厂,服务,控制器,指令等)被注册,并且可以通过注入来使用,而不管它们的位置。这是由角FW提供给你的。 Angular具有隐式和显式注入;

隐式注入使用函数参数名称来自动检测注入的依赖关系。这对开发很有好处,但会破坏缩小的代码。好消息是有些工具可以将明确的注入转化为明确的即ng-anotate。您的暗示注入的代码看起来像

// 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系统引用。它在哪里生活并不重要什么是重要的是,如果你注入它,或者如果你通过你的应用程序请求,你可以从角码中的任何地方引用它$注入器 –