John Papa著名的Angular 1 Style Guide建议使用IIFE,以避免var myApp = angular.module('myApp',[]);
之类的内容并污染全局命名空间。
给出的例子是:
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() { }
})();
这是怎么回事?我不需要至少声明一次模块吗?例如angular.module('app',[]);
(封装在IIFE中?(而不是var app = angular.module('app',[]);
以避免全局变量(?
然而,angular.module('app')
在本例中的两种用法没有声明,而是将对angular.module('app')
求值两次,这肯定不是一件好事(事实上,我之前读到一个投票率很高的S.O.问题,说这是一件坏事,应该有一个引用,但那将是一个全局引用,也是一件坏事(。
是哪一个?或者,我可以在单独的文件中声明我的angular.module('app')
以及一些控制器、服务、工厂、指令,在单独的IIFE中声明吗?如果是,如何?
我不需要至少声明一次模块吗?
是的,模块需要首先创建依赖项:
app.js
angular.module('app',['ngRoute']);
这必须在任何后续脚本添加到它之前完成。它不需要包含在IIFE中,因为它没有声明任何全局变量。
为了避免全局名称空间的污染,需要将以下内容包含在IIFE中:
logger.js
(function() {
'use strict';
angular
.module('app')
.factory('logger', logger);
function logger() { }
})();
另一方面
storage.js
'use strict';
angular.module('app')
.service('storage', function storage() {
var value;
this.get = function() { return value; };
this.set = function(val) {
value = val;
};
})
这不需要IIFE,因为它不声明任何全局变量或函数。
这两个示例都避免了污染全局命名空间。
有关更多信息,请参阅
- AngularJS angular.module方法API参考
angular.module('app')
没有数组作为第二个参数是getter,可以多次使用。
为了改进这一点,你需要一些构建工具,例如我们使用webpack(它将把所有东西都打包到u btw的IIFE中(,现在它看起来是这样的:
logger.js:
export default ['$log', function($log) {}]
storage.js:
export default ['$http', function($http) {}]
module.js:
import logger from './logger.js';
import storage from './storage.js';
angular
.module('app')
.factory('logger', logger)
.factory('storage', storage);