Те люди, которые работают с AngularJS, знают про директиву ngController. В нее передается функция, описывающая поведение блока с директивой. И тут начинается магия! Если наша функция выглядит так:
SomeController = function ($scope) {...};
то она будет вызвана с одним параметром — scope, связанным с контроллером. А если, она выглядит, например, так:
SomeController = function ($http, $location, $scope) {...};
то передаваемых параметров станет внезапно три: два системных сервиса ($http и $location) и тот же самый scope.
Так как же фреймворк определяет, какие параметры нужны для вызова контроллера? Эта магия называется Function.toString()
. Метод toString()
у функции возвращает ее текст, а дальше дело техники: /^function\s*[^\(]*\(\s*([^\)]*)\)/m
. Получили имена параметров, разобрали, подставили. Вот такой нетривиальный подход.
Детали можно посмотреть в исходниках.
Хочется что-то добавить или сказать? Я всегда рад обсудить. Пишите на me@dikmax.name.