在匿名函数中包装控制器

时间:2014-01-30 00:48:51

标签: angularjs

我是否这样做:

(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编写了两种方式。

谢谢!

2 个答案:

答案 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程序冲突。