AngularJS: отличие scope.$apply() от scope.$digest()

Часто слышу этот вопрос. Вроде бы и документация стала лучше, и столько уже обсуждений по этому поводу есть. Но всеравно у многих этот вопрос остается открытым.

Если глянуть в исходники ведь все становится ясно:

[javascript]
$apply: function(expr) {
try {
beginPhase(‘$apply’);
return this.$eval(expr);
} catch (e) {
$exceptionHandler(e);
} finally {
clearPhase();
try {
$rootScope.$digest();
} catch (e) {
$exceptionHandler(e);
throw e;
}
}
},
[/javascript]

scope.$apply() просто оболочка на $rootScope.$digest() плюс отлов исключений и выполнение expr параметра.

Итого: если нам нужно обновить наблюдателей(watchers) в каком-то конкретном scope и нам не важна обработка исключительных ситуаций – например в тестах – можем смело делать scope.$digest().