3

在这个页面上,http://docs.angularjs.org/guide/concepts,在“运行时”描述中有一个声明:

$evalAsync 队列用于安排需要在当前堆栈帧之外发生但在浏览器视图呈现之前发生的工作。这通常使用 setTimeout(0) 来完成,但是 setTimeout(0) 方法会遇到缓慢的问题,并且可能会导致视图闪烁,因为浏览器会在每个事件之后渲染视图。

谁能解释在堆栈框架之外发生了什么,但在浏览器的视图渲染意味着之前?

4

1 回答 1

2

您可以将堆栈视为 Javascript 解释器运行的函数的有序列表。例如:

function a () { b();  }
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();

在 A 点,堆栈将是(它实际上会被抛出的异常打印出来):

  1. C
  2. b
  3. 一个

(顶部的最新功能)。

$evalAsync意味着任务将在堆栈之外被调用。例如:

function a () { $evalAsync(b); c(); } 
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();

堆栈可能看起来像:

  1. C
  2. b

注意这里没有a()-b()在堆栈之外调用。在实践中,这意味着:

  • b()将在c()事件之后调用,尽管在$evalAsync(b)之前调用c()
  • 的调用堆栈b()将不包含a(). 它会使调试变得更加困难。
于 2013-08-31T14:51:58.970 回答