我是否这样做:
(function () {
'use strict';
// Create the module and define its dependencies.
var app = angular.module('app', [
// Angular modules
'ngAnimate', // animations
'ngRoute' // routing
// Custom modules
// 3rd Party Modules
]);
// Execute bootstrapping code and any dependencies.
app.run(['$log',
function ($log) {
$log.log('we are loaded');
}]);
})();
或
'use strict';
// Create the module and define its dependencies.
var app = angular.module('app', [
// Angular modules
'ngAnimate', // animations
'ngRoute' // routing
// Custom modules
// 3rd Party Modules
]);
// Execute bootstrapping code and any dependencies.
app.run(['$log',
function ($log) {
$log.log('we are loaded');
}]);
两者似乎都有效 - 有什么区别?
我很欣赏有关匿名函数的解释,何时使用,以及为什么我看到控制器为AngularJs编写了两种方式。
谢谢!
答案 0 :(得分:35)
两者都有效。您将在匿名函数中找到大量JavaScript代码的原因是将其与页面上的其他代码隔离开来。
以下代码将在全局范围内声明一个名为name
的变量:
var name = "Hello World";
通过使用该代码,页面上任何其他尝试使用名为name
的变量的脚本都可能会获得"Hello World"
的意外值,因为您的脚本将其声明为"Hello World"
。< / p>
通过将该代码包装在匿名函数中,可以防止代码与名为name
的其他变量冲突:
(function() {
var name = "Hello World";
})();
在上面的示例中,name
现在仅在匿名函数的范围内可用。它不全局,因此不会与页面上的其他代码冲突。
在您提供的第二个代码段中,app
现在将是一个全局变量,可能会被声称名为app
的全局变量的其他人覆盖。通过将Angular模块包装在匿名函数中,可以防止代码与其他代码冲突。
此外,其他可能使用您的代码的人不必担心它会改变其全局范围。
答案 1 :(得分:4)
JavaScript的局部变量只存在于函数范围内!
因此,如果您使用IIFE(立即调用的函数表达式),如下所示:
(function () {
var app = angular.module('app', []);
})();
您无法在该功能之外访问您的模块:
(function () {
var app = angular.module('app', []);
})();
// will get app is undefined error
app.run(['$log', function ($log) {
$log.log('we are loaded');
}]);
声明局部变量而不是全局变量是一个好主意。这将使您的app变量无法在全局环境中访问。
如果声明一个全局变量, 你的变量可以在任何地方使用,也许与其他javascript程序冲突。