as you can see from Angular’s $apply pseudo-code:
Internally angular does the following:
and since $scope.$apply uses $rootScope, it affects all its descendants by dirty-checking EVERY data-bound objects, it’s crazy, a major hit on performance.
so If you need to update a child scope, you can call $scope.$digest to dirty-check ONLY that scope and its descendants and as a result you reduce the number of dirty-checks and increase your performance.
but be aware, Angular’s documentation favors $apply since it simpler to use $apply all the time and $apply has special error handling that $digest lacks.
Hope you’ll find this post helpful.