“控制器污染全局命名空间”在Angular中意味着什么

时间:2014-09-02 17:12:45

标签: javascript angularjs

我是Angular.js的新手,我读过控制器不应该污染全局命名空间。

它的真正含义是什么

以及为什么angular.module('SomeApp',[]).controller('SomeController', function($scope) {})

是添加控制器的最佳方式吗?

2 个答案:

答案 0 :(得分:3)

编辑:污染全局命名空间不是特定于Angular,而是特定于Javascript(实际上是任何动态类型语言,其中变量可以在几乎任何范围内出现或重新声明)。

污染全局命名空间会使得不可用 - 实际上:将覆盖模块中的某些名称。

想象一下,我在'a.js'中有一个模块A,我声明:

mymodule = angular.module('A');

function Foo($s, $http){ ... };
foo = mymodule.controller('foo', ['$scope', Foo]);

还想象一下,我事先包含了一个名为'utils.js'的脚本:

foo = 3;
a.js中的

foo将覆盖我的utils脚本中的foo。这污染了全局命名空间,这就是为什么这是一个坏主意(也许我实际上需要foo var)。

想拥有这样的代码而不是链接电话吗?使用闭包:

/* a.js */
(function(){
    var mymodule = angular.module('A');

    function Foo($s, $http){ ... };
    var foo = mymodule.controller('foo', ['$scope', Foo]);
})();

因此,您不会污染全局命名空间,因为每个声明都在匿名函数调用中。

答案 1 :(得分:2)

您使用的格式

angular.module('SomeApp',[]).controller('SomeController', function($scope) {})

不会污染全局命名空间。


然而,这种格式:

<强>的Javascript

function UserController($scope) { ... }

<强> HTML

<div ng-controller="UserController">

这是因为控制器功能在角度应用程序范围之外全局可用