Я не совсем понимаю, почему объект $ scope предоставлен как аргумент как наблюдателю, так и функции слушателя. Я нашел его бит кода на GitHub, это часть, которая повторяется над массивом наблюдателей в $ digest:
this.$$watchers.forEach(function(watcher) {
var newValue = watcher.watchFn(self);
var oldValue = watcher.last;
if (watcher.deep && newValue === oldValue) {
deppCompare(newValue, oldValue);
} else {
if (newValue !== oldValue) dirty = true;
}
watcher.listenerFn(newValue, oldValue, self);
watcher.last = newValue;
});
За кулисами, когда вы объявляете это функцией часов в определенной области, угловое синтаксическое разложение выражения, данного в функции:
//The code of a random watcher
$scope.$watch('myVariable', listenerFunction);
//Behind the scenes
$scope.$watch(function(scope){
return scope.myVariable;
}, listenerFunction);
Когда вы регистрируете наблюдателя, ожидаемое поведение, которое "в ЭТОМ СФЕРАХ, мне нужно следить за изменениями для переменной, включенной в ЭТОЙ СФЕРАХ ", поэтому за кулисами первый аргумент $watch()
анализируется угловым для возврата ожидаемая переменная должна быть переменной в области, в которой была добавлена функция часов.