Почему переменное имя "$ scope" необходимо?

Я новичок в Javascript (только что закончил книгу "Красноречивый Javascript" ), и сейчас я читаю AngularJS от O'Reilly. И получение этого небольшого фрагмента кода для работы из книги заставляло меня сумасшедшим часами и приводило меня к кроличьим отверстиям, думая, что я где-то испортил настройку своей среды. Единственное различие в коде, предоставленном в книге AngularJS, и код, который я набрал, заключались в том, что я оставил "$" в "$ scope" в функции TextController. Ввод "$" обратно позволил коду работать.

Вот мои рассуждения о том, чтобы изначально его оставить: О, "$ scope" - это просто имя переменной, локальное для функции. Как и любой другой язык программирования, такой как Java или С++, потому что этот параметр является только локальной переменной, я могу назвать его как угодно, поскольку любой аргумент, передаваемый в функцию, будет просто передаваться по значению.

Пожалуйста, исправьте мои рассуждения и объясните, почему имя параметра должно быть "$ 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>

Ответ 1

Это обрабатывается инжектором Angular.

http://docs.angularjs.org/api/auto/service/ $инжектор

В JavaScript при вызове функции toString() функция возвращает определение функции. Затем определение может быть проанализировано, и аргументы функции могут быть извлечены. ПРИМЕЧАНИЕ. Это не работает с инструментами минимизации и обфускации, поскольку эти инструменты изменяют имена аргументов.

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

При задании функции инжектор может вывести имена службы для инъекции, изучив объявление функции и извлекая имена параметров. В приведенном выше примере $scope и greeter - это две службы, которые необходимо ввести в функцию.

Ответ 2

Оба предыдущих ответа верны, просто вы должны знать, что вы можете "переопределить" поведение по умолчанию, если вы объявляете контроллер таким образом:

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/

Ответ 3

Поскольку Angular использует имя параметра в своей системе впрыскивания, которая создает контроллер.