JavaScript 中用来描述一个完整的调用帧周期的术语是什么?

What is the term used to describe a complete call frame cycle thing in JavaScript?

在JavaScript中,有执行路径的概念,从某个点(例如事件处理程序)开始,在某个点将控制权交还给浏览器。

这个进程有合适的名称吗?

最初我认为您可以将其称为 "current Stack Frame",但在阅读维基百科后我发现它指的是其他东西。这不是调用堆栈,那是我们去过的地方的面包屑。

(为尴尬的标题道歉......我愿意接受建议:))

tick 是您要找的字词吗?在 node.js(公认的是 JavaScript)中,有一个名为 process.nextTick() 的函数接受一个回调函数,该回调函数应该在当前执行周期后立即在 "tick" 上执行。这是我一直使用的术语,但可能还有其他常用术语来描述 JavaScript.

的事件周期

我听说这个叫做 "turn of the event loop"(Mozilla 的工程师和 ECMAScript 标准委员会 TC39 的成员)。


在 ECMAScript 标准中,Jobdefined 和 "an abstract operation that initiates an ECMAScript computation when no other ECMAScript computation is currently in progress"。这正是您要查找的内容,但该术语并未广泛使用。

HTML 标准 describes event loops in bewildering detail,但它使用的术语 任务 也没有被广泛使用。

我认为您所问的问题没有一个公认的标准术语。

我刚刚听说它是 "back to the event loop""finish the current thread of execution and return to the event loop".

并且,node.js 使用术语 "next tick" 来表达类似的意思。

Javascript(在浏览器和 node.js 中)是事件驱动的,所有异步操作或用户事件都是通过将事件放入事件队列来执行的,并且只有在以下情况下才会处理该事件当前执行线程完成,然后 JS 引擎可以从事件队列中拉出下一个事件并开始执行。因此,由于底层机制是事件队列驱动的,因此无论您用什么术语来描述它,都通常使用短语 "event"

This article on Understanding process.nextTick()指的是"every tick of the event loop".

You can imagine this event loop to be a queue of callbacks that are processed by Node on every tick of the event loop.

node.js documentation for process.nextTick()使用"event loop turn runs to completion".

Once the current event loop turn runs to completion, call the callback function.

node.js documentation for setImmediate()指的是"event loop iteration".

Callbacks for immediates are queued in the order in which they were created. The entire callback queue is processed every event loop iteration. If you queue an immediate from inside an executing callback, that immediate won't fire until the next event loop iteration.

您要查找的字词是"event loop"

虽然事件循环的含义之一是在应用程序的生命周期内收集 "cycles",但它也简单地表示 "one cycle" - 至少在英语中是这样。

在语法上,用法规则类似于"the road"和"a road"之间的区别,"the road"指的是旅途中的整个路线,"a road"指的是许多道路中的一段组成 "the road".

的片段

因此,在谈论架构时,我们称之为 "the event loop"。当谈论这个循环中的一个循环时,我们简单地说 "a loop" 或更具体地说 "one cycle of the event loop".

这个术语很旧。它起源于 70 年代末和 80 年代初创建的 GUI 框架。原始 Mac OS 的早期开发人员文档将其称为事件循环(当时的 Mac 没有线程支持,所以像 javascript 整个 OS 是单线程的)。

80 年代初发布的古老的 Tk UI 库也将其称为事件循环。顺便说一下,Tcl 编程语言,就像它之后出现的 javascript 一样,带有一个内置的事件循环。

传统上用于将控制权交还给事件循环的术语是"yield"。在某些语言 and/or 框架中,实际上有一个名为 "yield" 的关键字或函数来执行此操作。在 Tcl 中,它被称为 "update",因为这是您从代码中故意进入事件循环时调用的函数的名称。

Javascript 没有此功能*,因此 javascript 编程中没有用于故意进入事件循环的术语。解释器将简单地进入事件循环,其中没有其他东西可以运行(基本上当它到达所有文件的末尾时)。


*注意:从技术上讲,您可以间接导致代码挂起并进入浏览器中的事件循环。如果您更新 DOM 然后立即查询它(例如设置 margin-width 然后查询 offsetWidth),浏览器将进入事件循环以重排 DOM。但是这个功能不能用于其他任何事情,因为浏览器只会执行回流过程而不会触发任何其他事件。

您指的是一个空的“回调队列”。如其他答案中所述,这会被“事件循环”清空。

Philip Roberts (@latentflip) gave a fantastic talk on this very topic at JSConf EU '14. Here's the video and transcript of his talk http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html。很棒的观察,一定会让你更好地理解 javascript 是如何执行的!