角度如何污染全球空间?

时间:2015-06-14 04:50:56

标签: javascript angularjs

我是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中的全局空间污染情况。

2 个答案:

答案 0 :(得分:3)

在示例1中,您正在以这样的方式声明该函数:它可以在您的js代码中的任何位置访问 - 但在第二个示例中,您以不能在任何地方调用它的方式声明它除了通过angular - 因为您将控制器函数作为函数参数本身传递,因此将其限制为angular.module().controller()函数的范围。

函数和变量的声明仅限于它们通常声明的最小范围 - 如果您在<script>标记的范围内命名函数,那么您将在{{1}的范围内声明它} object`是主要的全局,因此“污染全局范围”。希望这会有所帮助。

答案 1 :(得分:3)

两个示例都将angular添加到全局命名空间。示例1还将函数NameCtrl添加到全局命名空间,该命名空间有资格污染它。但是,示例2还将nameApp添加到全局命名空间,因此您可以争辩说它们都会同等地污染全局命名空间。但是,使用示例2,至少控制器不会添加到全局命名空间,因此它被认为是更好的形式。换句话说,如果您要向全局命名空间添加任何内容,最好添加一个模块并使用它来添加任何控制器。实际上,如果你愿意的话,你甚至可以避免将模块添加到命名空间中,所以如果你想分裂(并且烦恼人们),你可以争辩说,如果目标是避免污染全局命名空间,那么它们都不是100%正确的。