Javascript Angular会在相同的$digest循环中重新评估相同的$watch表达式吗?

Javascript Angular会在相同的$digest循环中重新评估相同的$watch表达式吗?,javascript,angularjs,Javascript,Angularjs,如果我有以下形式的模板: <div ng-controller="testCtrl"> <div ng-if="exFn()"></div> <div ng-if="exFn()"></div> </div> ngController作用域是否会每$digest调用exFn两次,或者作用域是否会记住exFn()表达式的新值并使用它而不是重新计算表达式?它将调用exFn四次。两次找出每个手表的原始值,然后

如果我有以下形式的模板:

<div ng-controller="testCtrl">
    <div ng-if="exFn()"></div>
    <div ng-if="exFn()"></div>
</div>


ngController作用域是否会每$digest调用
exFn
两次,或者作用域是否会记住
exFn()
表达式的新值并使用它而不是重新计算表达式?

它将调用
exFn
四次。两次找出每个手表的原始值,然后再两次看看它们是否稳定。这是有意义的:函数可能依赖于外部状态。

现在手表表达式的堆叠方式,angular只需调用
exFn
两次,每个地方调用一次,如果将同一个ngIf多次放入一个ngRepeated元素中,似乎会浪费大量处理。如果函数依赖于外部状态,则不会。想象一下,如果函数的目的是向控制台输出一些东西,或者执行XHR调用,或者变异一些变量,我想这是一种折衷,允许人们将框架弯曲到超出其原始目的和处理,因为watch表达式在理论上应该是幂等的。