我看到很多人用他们的控制器包装:
function(){
//CODE
}();
那里的利益/目标是什么?
答案 0 :(得分:4)
这与Angular没有直接关系,它是一个JS模式,被称为Immediately Invoked Function Expression。
它是JavaScript中最有用的模式之一,主要是因为:
代码封装
自JS functions have closures以来,我们可以非常轻松地使用此模式创建私有数据:
var index = (function iife() {
var counter = 0; // <-- this is private, only available inside the closure of inner()
return function inner() {
return counter++;
};
})();
console.log(index()); // 0
console.log(index()); // 1
console.log(index()); // 2
console.log(index.counter) // undefined
我们还可以将参数传递给IIFE,这允许我们控制我们如何访问IIFE的外部上下文。例如,要确保$
实际上是代码中的jQuery
对象:
(function ($) {
// here have access to the global jQuery as $ regardless of what window.$ is and
// how many libraries are trying to use $
})(jQuery);
通过结合上述两个想法,IIFE还可用于实现模块模式,这是RequireJS和NodeJS如何分离代码的基础:
var myModule = (function iife(initData) {
// we can use initData here to initialize our module if necessary
var module = {};
// private vars ...
var privateVar1, privateVar2;
// private methods ...
function privateMethod() {
console.log('yeeey');
}
module.somePublicProperty = 1;
module.somePublicMethod = function() {
privateMethod();
};
return module;
})(/* pass initialization data */);
myModule.somePublicMethod(); // 'yeeey'
答案 1 :(得分:3)
您在匿名函数中找到大量JavaScript代码的原因是将其与页面上的其他代码隔离开来。
以下代码将在全局范围内声明名为name的变量:
(function() {
var name = "Hello World";
})();
通过使用该代码,页面上任何试图使用名为name的变量的其他脚本都可能会获得&#34; Hello World&#34;因为你的脚本将其声明为&#34; Hello World&#34;。
通过将该代码包装在匿名函数中,可以防止代码与名为name的其他变量发生冲突:
{{1}}
在上面的示例中,name现在仅在匿名函数的范围内可用。它不是全局的,因此不能与页面上的其他代码冲突。
通过将Angular模块包装在匿名函数中,可以防止代码与其他代码冲突。
此外,其他可能使用您的代码的人不必担心它会改变其全局范围。
答案 2 :(得分:0)
@ nem035和@tcasey所说的一切都是正确的,但也会产生另一种副作用。
如果您使用Grunt
或Gulp
等工具,它还允许您使用dists
投入生产。
如果您不使用Immediate Invoke Pattern
,您很可能会出现缩小问题,例如:
State X is already defined!
Unknown provider
我建议你用这种模式包装你所有的js模块。
我希望我能提供帮助。
答案 3 :(得分:0)
您immediately-invoked-function-expression短期IIFE有很多好处,也是您使用它的最佳做法。这样,角度服务或控制器中的每一个都变得孤立,并且如果您不使用IIFE,就不会遇到全局变量。
答案 4 :(得分:0)
恕我直言,它没有必要,甚至是多余的,因为大多数控制器已经是功能:
'use strict';
angular.module('MyApp').controller('AboutController', ['$scope'
function ($scope) {
$scope.title = 'About Us';
}
]);