在闭包中隐藏模块的原因是什么?

问题描述:

作为一个例子:在闭包中隐藏模块的原因是什么?

(function() { 
    angular.module('Base', []).controller('BaseController', function($scope) { 
    $scope.mixin1 = function() {}; 
    }) 
})(); 

什么是在封装angularjs模块点?我以为默认是这样的。

为了避免污染全局命名空间,编译这将产生像这样的IIFE内/级联包中所有的功能:如果你不封装您的功能,然后你会污染全球范围,它不好。 read this

(function() { 
    angular.module('app', []); 

    // MainCtrl.js 
    function MainCtrl() { 

    } 

    angular 
    .module('app') 
    .controller('MainCtrl', MainCtrl); 

    // AnotherCtrl.js 
    function AnotherCtrl() { 

    } 

    angular 
    .module('app') 
    .controller('AnotherCtrl', AnotherCtrl); 

    // and so on... 

})(); 
+0

那更清晰的例子!谢谢,@Narek! – 2014-10-28 06:42:55

将这些代码封装在匿名函数/闭包中是一种很好的做法,因为当解析器解释代码时,它内部的所有代码都会立即调用。 您可能不会使用它,它的工作原理也是一样。但是,如果你像这样封装整个代码,你就可以轻松地从一个脚本移动到另一个脚本。

看看*this

+1

能够从链接中提供更多信息或摘要,而非仅仅链接异地,这将非常棒。 – 2014-10-28 06:16:25

+1

除了它似乎没有真正连接到角模块案例 – 2014-10-28 06:18:47

一般来说,原因是为了避免产生全局变量。

但是在你的例子中,如果你总是把代码放在控制器函数中,就不需要了。

那么有什么意义?......除了遵循一个样式模式,我没有看到示例中的要点。

与其依靠手工做这些额外的东西,还有一些工具可以为你做。从简单的concat(比如grunt-contrib-concat或Yeoman的usemin)到更复杂的Browserify。 (Browserify用于翻译nodejs代码,但它可以很好地用AMD样板包装现有的浏览器代码)。