在这个页面上,http://docs.angularjs.org/guide/concepts,在“运行时”描述中有一个声明:
$ evalAsync队列用于调度需要在当前堆栈帧之外但在浏览器的视图渲染之前发生的工作。这通常使用setTimeout(0)来完成,但是setTimeout(0)方法会慢,并且可能会导致视图闪烁,因为浏览器会在每个事件之后呈现视图。
有人可以解释 在堆栈框架之外发生了什么,但在浏览器的视图渲染之前 意味着什么?
答案 0 :(得分:2)
您可以将堆栈视为Javascript解释器运行的有序函数列表。例如:
function a () { b(); }
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();
在A点,堆栈将是(它实际上将被抛出的异常打印):
(最新的功能在上面)。
$evalAsync
表示任务将在堆栈外部调用。例如:
function a () { $evalAsync(b); c(); }
function b () { c(); }
function c () { /* POINT A */ throw new Error('x'); }
a();
堆栈可能看起来像:
注意此处没有a()
- 在堆栈外调用b()
。在实践中,这意味着:
b()
将在c()
事件后调用,但在$evalAsync(b)
之前调用c()
。b()
的调用堆栈不包含a()
。它可以使调试更加困难。