2016-08-05 63 views
4

我已经看到了一些人的包装控制器,具有:为什么用匿名函数包装角码控制器代码?

function(){ 
    //CODE 
}(); 

有什么好处/目标呢?

+0

从我的理解,很多是防止全局命名空间 –

+1

其分毫的污染有关特定的角度,你可以[在这里阅读更多](http://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) –

+0

匿名函数创建一个闭包,并阻止访问变量和函数 –

回答

0

恕我直言,这是没有必要的,甚至是多余的,因为大多数控制器都已经功能:

'use strict'; 

angular.module('MyApp').controller('AboutController', ['$scope' 
    function ($scope) { 
    $scope.title = 'About Us'; 
    } 
]); 
+1

malix:这是我的印象......不知道我是否错过了一些东西。这可能是一个很好的JS练习,似乎在Angular中已经提到。所以不确定额外的换行是否合理。 – cnak2

+0

有人可能会证明我错了,但我不明白它是如何添加除圈复杂性以外的任何东西... – malix

3

您会发现很多包含在匿名函数中的JavaScript代码的原因是将其与页面上的其他代码隔离。

下面的代码会宣布在全球范围内名为name变量:

var name = "Hello World"; 

通过使用代码,试图使用一个名为名称的变量在页面上的任何其他脚本可能会得到意想不到的价值“Hello World”,因为你的脚本声明它为“Hello World”。

通过包装的代码在一个匿名函数,你把代码从一个名为名称的其他变量发生冲突:

(function() { 
    var name = "Hello World"; 
})(); 

在上面的例子中,名字现在只有匿名函数的范围内可。它不是全球性的,因此不能与页面上的其他代码发生冲突。

通过将您的Angular模块包装在匿名函数中,可以防止代码与其他代码发生冲突。

此外,其他人可能会使用您的代码将不必担心它改变其全球范围。

4

这不是直接与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'

0

的everythin g @ nem035和@tcasey说的是正确的,但它也有另一个副作用。

如果您使用诸如GruntGulp之类的工具,它还允许您让dists投入生产。

如果你不使用Immediate Invoke Pattern你最有可能有这样微小的问题:

  • State X is already defined!
  • Unknown provider
  • 。 。 。

我建议你用这种模式包装所有的js模块。

我希望我一直有帮助。