为什么变量名是"$scope"必要的

Why is the variable name "$scope" necessary ?

本文关键字:quot scope 变量名 为什么      更新时间:2023-09-26

我对Javascript相当陌生(刚刚读完《雄辩的Javascript》一书),目前正在阅读O'Reilly的AngularJS。从书中获取这一小段代码让我疯狂了几个小时,让我陷入了兔子洞,认为我在设置环境的某个地方搞砸了。AngularJS书中提供的代码和我输入的代码的唯一区别是,我在TextController函数的"$scope"中省略了"$"。把"$"放回去,代码就可以工作了。

这是我最初省略它的原因:哦,'$scope'只是函数的局部变量名。像任何其他编程语言,如Java或c++,因为这个参数只是一个局部变量,我可以给它起任何我想要的名字,因为传递给函数的任何参数都是按值传递的。

请纠正我的推理,并解释为什么参数的名称必须是"$scope"。

<!doctype html>
<html ng-app>
<body ng-controller="TextController">
  <p>{{someText}}</p>
  <script src="angular.min.js"></script>
  <script>
    function TextController($scope) {
      $scope.someText = 'You have started your journey.';
    }
  </script>
</body>
</html>

这是由Angular的注入器处理的。

http://docs.angularjs.org/api/auto/service/美元注入器

在JavaScript中对函数调用toString()将返回函数定义。然后可以解析定义并提取函数参数。注意:这不适用于缩小和混淆工具,因为这些工具会更改参数名称。

http://docs.angularjs.org/guide/di

给定一个函数,注入器可以通过检查函数声明并提取参数名来推断要注入的服务的名称。在上面的例子中,$scope和greeter是需要注入到函数中的两个服务。

前面两个答案都是正确的,只是你应该知道,如果你以这种方式声明一个控制器,你可以"覆盖"默认行为:

module.controller("ControllerName",["$scope",function( custom_name ){ ... }]);

的例子:

var app = angular.module("myApp",[]);
app.controller("TextController",["$scope",function(glue){
    glue.name1 = "John";
    glue.name2 = "Paul";
    glue.name3 = "George";
    glue.name4 = "Ringo";
}]);

然后:

<div ng-controller="TextController">
    Hello {{ name1 }}, {{ name2 }}, {{ name3 }}, {{ name4 }}!
</div>

在这里工作:http://jsfiddle.net/d4M2P/

因为Angular在构建控制器的依赖注入系统中使用了该参数的名称。