(function())在哪里?

时间:2014-04-30 05:33:13

标签: javascript angularjs

我正在查看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());实际上完成了什么?

这样做的优点是什么?

3 个答案:

答案 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)

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