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

"Controllers polluting the Global Namespace" what does it mean in Angular

本文关键字:Angular 它在 意味着 什么 命名空间 quot 控制器 污染 全局      更新时间:2023-09-26

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

到底意味着什么

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

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

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

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

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

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

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

foo = 3;

.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]);
})();

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

您使用的格式

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

不会污染全局命名空间。


然而,这种格式将:

Javascript

function UserController($scope) { ... }

HTML

<div ng-controller="UserController">

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