为什么用匿名函数包装角度控制器代码?

时间:2016-08-05 16:55:21

标签: javascript angularjs

我看到很多人用他们的控制器包装:

function(){
   //CODE
}();

那里的利益/目标是什么?

5 个答案:

答案 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所说的一切都是正确的,但也会产生另一种副作用。

如果您使用GruntGulp等工具,它还允许您使用dists投入生产。

如果您不使用Immediate Invoke Pattern,您很可能会出现缩小问题,例如:

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

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

我希望我能提供帮助。

答案 3 :(得分:0)

immediately-invoked-function-expression短期IIFE有很多好处,也是您使用它的最佳做法。这样,角度服务或控制器中的每一个都变得孤立,并且如果您不使用IIFE,就不会遇到全局变量。

read more about it

答案 4 :(得分:0)

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

'use strict';

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