What you are seeing is the result of Angular's $digest cycle.
https://docs.angularjs.org/api/ng/type/$rootScope.Scope
From the Angular docs...
$digest();
Processes all of the watchers of the current scope and its children. Because a watcher's listener can change the model, the $digest() keeps calling the watchers until no more listeners are firing. This means that it is possible to get into an infinite loop. This function will throw 'Maximum iteration limit exceeded.' if the number of iterations exceeds 10.
Each $digest will evaluate all watchers, which in your case means calling your function each time.
If you are exceedingly curious about how this happens then place a breakpoint on the $digest function in the Angularjs source and you will see your function called as part of that cycle. Basically enters a do-while loop and executes your function until its internal logic is satisfied that no more digest cycles are needed. For the simple case as demonstrated by your code, that was exactly three times.
The condensed version of the above cycle is that your function is executed once to initialize the watch value within the $digest cycle. It is then evaluated in a loop of the cycle to see if anything has changed, which results in a second call to your function. Finally a third execution occurs at which time if the value has not changed the $digest logic is satisfied that we can end our loop.