我是angularJS的新手,我在http://curran.github.io/screencasts/introToAngular/exampleViewer/
的angularJS上练习在下面的例子中,我们说我们正在污染全球空间,但我不明白我们如何污染示例1中的全局空间,但是在示例2中没有。
示例1
<html ng-app="nameApp">
<head>
<meta charset="utf-8">
<title>Angular.js Example</title>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.min.js"></script>
<script>
var nameApp = angular.module('nameApp', []);
nameApp.controller('NameCtrl', function ($scope){
$scope.firstName = 'John';
$scope.lastName = 'Smith';
});
</script>
</head>
<body ng-controller="NameCtrl">
First name:<input ng-model="firstName" type="text"/>
<br>
Last name:<input ng-model="lastName" type="text"/>
<br>
Hello {{firstName}} {{lastName}}
</body>
</html>
示例2
#!/usr/bin/awk -f
BEGIN {
RS = "[ \n+]"
FS = "^"
OFS = "*"
}
{
z = $2
for (y=2; y<=z; y++)
$y = $1
printf "%s%s", $0, RT
}
我现在只想用示例来说明示例1中的全局空间污染情况。
答案 0 :(得分:3)
在示例1中,您正在以这样的方式声明该函数:它可以在您的js代码中的任何位置访问 - 但在第二个示例中,您以不能在任何地方调用它的方式声明它除了通过angular - 因为您将控制器函数作为函数参数本身传递,因此将其限制为angular.module().controller()
函数的范围。
函数和变量的声明仅限于它们通常声明的最小范围 - 如果您在<script>
标记的范围内命名函数,那么您将在{{1}的范围内声明它} object`是主要的全局,因此“污染全局范围”。希望这会有所帮助。
答案 1 :(得分:3)
两个示例都将angular
添加到全局命名空间。示例1还将函数NameCtrl
添加到全局命名空间,该命名空间有资格污染它。但是,示例2还将nameApp
添加到全局命名空间,因此您可以争辩说它们都会同等地污染全局命名空间。但是,使用示例2,至少控制器不会添加到全局命名空间,因此它被认为是更好的形式。换句话说,如果您要向全局命名空间添加任何内容,最好添加一个模块并使用它来添加任何控制器。实际上,如果你愿意的话,你甚至可以避免将模块添加到命名空间中,所以如果你想分裂(并且烦恼人们),你可以争辩说,如果目标是避免污染全局命名空间,那么它们都不是100%正确的。