回答
恕我直言,这是没有必要的,甚至是多余的,因为大多数控制器都已经功能:
'use strict';
angular.module('MyApp').controller('AboutController', ['$scope'
function ($scope) {
$scope.title = 'About Us';
}
]);
您会发现很多包含在匿名函数中的JavaScript代码的原因是将其与页面上的其他代码隔离。
下面的代码会宣布在全球范围内名为name变量:
var name = "Hello World";
通过使用代码,试图使用一个名为名称的变量在页面上的任何其他脚本可能会得到意想不到的价值“Hello World”,因为你的脚本声明它为“Hello World”。
通过包装的代码在一个匿名函数,你把代码从一个名为名称的其他变量发生冲突:
(function() {
var name = "Hello World";
})();
在上面的例子中,名字现在只有匿名函数的范围内可。它不是全球性的,因此不能与页面上的其他代码发生冲突。
通过将您的Angular模块包装在匿名函数中,可以防止代码与其他代码发生冲突。
此外,其他人可能会使用您的代码将不必担心它改变其全球范围。
这不是直接与Angular直接相关的任何东西,它是一个知道为Immediately Invoked Function Expression的JS模式。
这是在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);
通过这两个概念结合以上,IIFEs也可以被用来实现模块模式,这是怎样的基础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'
的everythin g @ nem035和@tcasey说的是正确的,但它也有另一个副作用。
如果您使用诸如Grunt
或Gulp
之类的工具,它还允许您让dists
投入生产。
如果你不使用Immediate Invoke Pattern
你最有可能有这样微小的问题:
State X is already defined!
Unknown provider
- 。 。 。
我建议你用这种模式包装所有的js模块。
我希望我一直有帮助。
你有很多好处immediately-invoked-function-expression短IIFE,它是使用它的最佳实践。这样,角度服务或控制器中的每一个都会变得孤立,并且您不会遇到全局变量,因为如果您不使用IIFE,它可能会发生。
- 1. Javascript:用匿名函数包装代码
- 2. 在Matlab中使用匿名函数封装代码?
- 3. 为什么数组在控制器中分配角码?
- 4. 倾销的源代码匿名函数
- 5. 什么是C#匿名类型代码VB.Net代码Equivelant?
- 6. 什么是更快?角表达式或控制器代码
- 7. 使用匿名函数将代码转换为PHP 5.2
- 8. 匿名代码块
- 9. 为什么控制器中的代码被调用两次?
- 10. 多个匿名Python函数的包装
- 11. 为什么函数open()和send()在下面的代码中的匿名函数()之后调用。?
- 12. 匿名函数错误和什么是匿名函数?
- 13. 匿名函数vs命名函数哪个更好,为什么
- 14. 为什么代码Igniter的模型/控制器/库不分离?
- 15. 为什么在生成器函数中调用清除代码?
- 16. 为什么必须在函数中包含C++代码?
- 17. 包装器的代码块
- 18. 如何将匿名jQuery代码转换为命名函数并调用它?
- 19. 匿名方法源代码
- 20. 包装函数和代码结构的命名
- 21. 星火匿名函数字节码
- 22. 使用Aptana安装源代码控制
- 23. 为什么我的代理包装Map函数会调用TypeError?
- 24. 什么是最简单的方法发送角阵到代码控制器
- 25. 为什么CoffeeScript的包装类的编译代码
- 26. 为什么我不能阻止vim包装我的代码?
- 27. 为什么在PHP标签中包装HTML代码
- 28. 块内的代码被包装在parens里面。为什么?
- 29. 为什么视图代码不能包装在类中?
- 30. 什么是vb.net相当于c#匿名代码块?
从我的理解,很多是防止全局命名空间 –
其分毫的污染有关特定的角度,你可以[在这里阅读更多](http://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) –
匿名函数创建一个闭包,并阻止访问变量和函数 –