JavaScript函数是异步的吗?

fud*_*din 15 javascript jquery

考虑以下正在执行的功能,

function loadPage()
{
    takeInput();
    processInput();
    outputInput();
}
Run Code Online (Sandbox Code Playgroud)

它们将按什么顺序执行(我已经读过它跟随堆栈,所以选项2将是答案)?

选项1

  1. takeInput();
  2. processInput();
  3. 输出输入();

选项#2

  1. 输出输入();
  2. processInput();
  3. takeInput();

Hal*_*yon 16

JavaScript函数不是异步的.一些非常有限的函数集具有异步API:

addEventListener,setTimeout,setInterval.这是唯一的3(我认为非常令人惊讶).

它们允许您传入最终可能被调用的回调.例如,当计时器到期时,或当用户点击某些内容时,或者当AJAX请求完成时.

JavaScript有一个事件循环.事件循环处理每个事件.如果您单击按钮3次,然后计时器到期,这也将是事件处理的顺序.这一切都非常明确和确定.

此外,JavaScript没有线程,它完全运行一个事件,直到在开始下一个事件之前没有任何事情要做(你返回).所以事件绝不会以任何方式干涉.这使您可以对数据状态做出非常强烈的假设.

  • 只有3个?那么,所有其他的呢? (4认同)
  • XHR怎么样?那么Node.js中可用的所有API呢? (2认同)

Que*_*tin 9

JavaScript函数是异步的吗?

有些是,大多数不是.

它们将按什么顺序执行

它们将按照调用它们的顺序执行.由于它们都是从同一个函数调用的,因此它将采用简单的线性顺序.

如果它们中的任何一个是以异步方式编写的,那么它们可能无法以相同的顺序完成所有活动.对于例如:

function a() {
   console.log('a'); 
}
function b() {
   console.log('b'); 
}
function c() {
   console.log('c'); 
}
function aAsync() {
  setTimeout(a, 500); 
}

function load() {
   aAsync();
   b();
   c();
}
load();
Run Code Online (Sandbox Code Playgroud)


小智 5

Javascript 不是异步的
它同步工作,即一次运行一行代码。当 javascript 代码运行时,首先创建一个全局执行上下文,如果你从全局执行上下文调用一个函数,另一个执行上下文由 javascript 引擎创建并放置在执行堆栈的顶部(全局执行上下文已经在堆栈中)并且如果从该函数内部调用另一个函数,则会创建另一个执行上下文并且堆栈大小不断增加。

因此,javascript 引擎一次一行地运行此代码,在该过程中,如果有任何事件/http 请求触发,浏览器会将它们放入EVENT QUEUE。因此,关键是 javascript 引擎不会在执行堆栈为空之前处理队列中的事件。当引擎处理完执行堆栈时,它会定期查看队列中是否有当前事件的任何事件处理程序,并类似地为该处理程序创建执行上下文并运行其中的代码。所以,整个过程只是同步的,异步只是由浏览器的其他部分(如渲染引擎或 http 引擎)处理,而 javascript 引擎继续同步运行代码。

因此,在您的情况下,无论调用哪个上下文函数loadpage,都会创建其执行上下文并将其放置在堆栈顶部。然后,它调用takeinput函数,即它的 exec。上下文被创建,并且其他函数上下文不会被创建并放置在堆栈中,直到 takeinput 上下文从执行堆栈中弹出。因此,正确的顺序将是 takeinput、processinput 和 outputinput。

我希望它能回答你的问题。