2014-04-30 35 views
0

我正在看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

值得关注的,因为本例中的API是棱角分明,虽然可以完成同样的事情,没有全球性的影响,这是少了很多灵活的(因为你不能轻易地通过围绕'MyController'函数作为参考):'app。控制器('MyController',['$ rootScope','$ scope',...,function(...){...}]];' – eyelidlessness

+0

所以你说在这种情况下声明控制器是没有用的? – user603007

+0

不,我说使用Array语法有明显的代价。 – eyelidlessness

回答

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/'; 

在全球范围内,在浏览器环境中,这会导致浏览器加载谷歌(和潜在的破坏当前页面的状态)。在功能范围(包括自我执行功能)中,它是完全安全的。

(function() { 
    var location = 'https://google.com/'; 
}()); 

该变量被分配给内存并立即被丢弃(指定为垃圾收集)。

另外值得注意:在全球范围内声明的,或不声明赋值的变量,作为全局对象的属性创建。执行在全球范围内,下面的都是等效的(尽管有上述事项有关全局对象的名称或可用性):

foo = 'bar'; 
var foo = 'bar'; 
this.foo = 'bar'; 
window.foo = 'bar'; 
0

它不是“无功能”,但功能被存储在一个变量。

好处在于,你可以节省一些代码和提高可读性很多:

var refreshFull = function() { 
    // 200 LoC 
} 
store.on('load',refreshFull); 
store.on('remove',refreshFull); 
store.on('filterchange',refreshFull); 
... 

请注意,该代码将永远有一个function()地方......无论你把它写在线或使用变量。

0

自我执行功能是像“使用它,并忘记”。默认情况下,自执行函数中声明的变量只能在自执行功能块中使用,因此您不必担心它们会污染您的全局范围。此外,他们不需要任何事件的执行