Angular 变化检测 zone.js

Angular change detection zone.js

对 Angular2+ 中关于 zone.js 的文章有疑问。我正在阅读 article from blog.angular-university.io。我认为有些部分有点神秘,对此有一些疑问以及我不确定我是否理解正确的事情。文章指出:

A zone is nothing more than an execution context that survives multiple Javascript VM execution turns.

上述语句是否意味着堆叠在事件队列中的多个异步回调具有一个执行上下文,因此 this 具有相同的值?

It's a generic mechanism which we can use to add extra functionality to the browser. Angular uses Zones internally to trigger change detection.

Angular 正在运行时更改 async 函数(settimeout、AJAX 等)。这是否意味着除了完成回调之外,回调还有额外的功能,Angular 用于检测变化

我现在的理解正确吗?如果不是,怎么了?

Does the above statement mean that multiple async callbacks which are stacked in the event queue have one execution context and thus the same value for this?

没有。将执行上下文简单地(过度简化)视为由特定区域中的所有代码 运行ning 共享的对象。例如在 bootstrap 期间,当 angular 模块被初始化时,Angular 创建(分叉)一个名为 'angular' 的区域。此外,它设置了一个 属性 'isAngularZone':true。您可以将其视为创建一个对象,其中设置了 new 属性。现在,这个 属性 将可用于 Angular 中的所有代码 运行ning(或计划到 运行),与 运行ning 在 angular区。但是,如果您 运行 您的代码在 angular 区域之外,则此 属性 将无法访问。

Does this mean that besides finishing the callback of the callback also has additional functionality which Angular uses to detect changes

回调没有任何附加功能。它是 Zone.js 处理回调的方式,它提供了 Angular 附加功能,例如确定何时开始更改检测周期。例如。当您在 setTimeout 函数中传递回调时,它会被 Zone.js 包装在另一个函数中,并用相同的函数代替您的回调。这是monkey patching API。现在,当 JS VM 调用 Zone.js 包装回调时,它会在实际调用您的回调方法之前执行各种操作。其中一项操作是通知区域(在其中调度该回调)回调的调用。在这里,如果该区域是 'angular',它将生成事件并启动更改检测周期。