2014-04-30 34 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

自我執行功能是像「使用它,並忘記」。默認情況下,自執行函數中聲明的變量只能在自執行功能塊中使用,因此您不必擔心它們會污染您的全局範圍。此外,他們不需要任何事件的執行