【问题标题】:What do you mean by executing outside of current stack在当前堆栈之外执行是什么意思
【发布时间】:2013-08-31 14:39:55
【问题描述】:

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

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

谁能解释发生在堆栈框架之外,但在浏览器的视图呈现之前是什么意思?

【问题讨论】:

  • 在我看来,这不是正确使用的术语。我认为,“......在当前执行线程之外”会更准确。一个“栈帧”是一个函数激活记录;特别是在 JavaScript 中,使用术语“堆栈框架”是有问题的,在这里更是如此。
  • 另外,我不确定在浏览器决定重新绘制页面(或页面的一部分)之前是否会运行 0ms 超时。我想在某些浏览器中可能是这样。

标签: javascript angularjs


【解决方案1】:

您可以将堆栈视为 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()。它会使调试变得更加困难。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2011-05-09
    • 1970-01-01
    • 2023-03-09
    • 2010-09-07
    • 2010-09-15
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多