0

对一篇关于zone.jsAngular2+ 的文章有疑问。我正在阅读blog.angular-university.io 的一篇文章。我认为有些部分有点神秘,并且有一些问题,我不确定我是否理解正确。文章指出:

一个区域只不过是一个执行上下文,它可以在多个 Javascript VM 执行轮次中幸存下来。

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

这是一种通用机制,我们可以使用它来为浏览器添加额外的功能。Angular 在内部使用 Zones 来触发变更检测。

Angular 正在运行时更改async函数(settimeout、AJAX 等)。这是否意味着除了完成回调的回调之外,Angular 还可以使用其他功能来检测更改

我现在的理解正确吗?如果不是,有什么问题?

4

1 回答 1

1

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

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

这是否意味着除了完成回调的回调之外,Angular 还可以使用其他功能来检测更改

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

于 2018-05-15T07:46:39.473 回答