在IIFE中宣布的变量在哪里?

时间:2016-04-15 02:32:40

标签: javascript angularjs

所以我理解IIFE的目的是将它们排除在全球范围之外。在Angular风格guide中,它说要避免这种情况:

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

我假设这让我可以在一段时间后在控制器中调用存储功能......但是如果它不在全局范围内的确切位置呢?

1 个答案:

答案 0 :(得分:2)

IIFE立即调用函数表达式的目的是模块化您的代码创建隔离的执行范围。 Angular有一个依赖注入系统,其中注册了指定的元素(工厂,服务,控制器,指令等),无论其位置如何,都可以通过注入使用。这是由角度FW提供给你的。 Angular具有隐式和显式注入;

隐式注入使用函数参数名称来自动检测要注入的依赖项。这对开发有好处,但会破坏缩小的ugglified代码。好消息是有一些工具可以将您的显式注入转换为显式的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
   }

我希望这有帮助