所以我理解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() { }
})();
我假设这让我可以在一段时间后在控制器中调用存储功能......但是如果它不在全局范围内的确切位置呢?
答案 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
}
我希望这有帮助