我正在查看this写得非常好的angularjs应用程序。
在他使用的控制器定义中:
(function () {
var MyController = function ($rootScope, $scope, $location, $routeParams, $timeout, config, dataService, modalService) {
//do something
}
MyController.$inject = ['$rootScope', '$scope', '$location', '$routeParams','$timeout', 'config', 'dataService', 'modalService'];
angular.module('app').controller('MyController', MyController);
}());
而不是(without function())
:
app.controller('MyController',function(){
//
});
(function());
实际上完成了什么?
这样做的优点是什么?
答案 0 :(得分:2)
这是一个自动执行的功能。好处是用var
声明的变量是函数范围的本地变量,不会污染全局范围。
var foo = 'something';
(function() {
var foo = 'something else';
}());
foo; // 'something'
this.foo; // 'something'
window.foo; // 'something'
(对于非浏览器环境,window
可能是global
或其他一些参考,或者可能无法直接访问。)
保护全球范围有很多好处。这意味着您不会干扰本身可能存在于全局范围内的其他模块或库,这意味着您不会覆盖可能导致意外副作用的全局属性。
考虑这种情况:
var location = 'https://google.com/';
在全球范围内,在浏览器环境中,这将导致浏览器加载Google(并可能破坏当前页面的状态)。在功能范围(包括自我执行功能)中,它是完全安全的。
(function() {
var location = 'https://google.com/';
}());
将变量分配给内存并立即丢弃(指定用于垃圾回收)。
另外值得注意的是:在全局范围内声明的变量,或者在没有声明的情况下分配的变量,都是作为全局对象的属性创建的。在全局范围内执行,以下内容都是等效的(尽管有关全局对象名称或可用性的上述说明):
foo = 'bar';
var foo = 'bar';
this.foo = 'bar';
window.foo = 'bar';
答案 1 :(得分:0)
没有"没有功能",但功能存储在变量中。
专业人士可以保存一些代码行并提高可读性:
var refreshFull = function() {
// 200 LoC
}
store.on('load',refreshFull);
store.on('remove',refreshFull);
store.on('filterchange',refreshFull);
...
请注意,无论您是内联还是使用变量,代码都会在某处function()
。
答案 2 :(得分:0)
自我执行功能就像"使用它并忘记"。默认情况下,在自执行功能中声明的变量只能在自执行功能块中使用,因此您不必担心它们会污染您的全局范围。他们也不需要任何执行事件