JavaScript函数是异步的吗?

考虑执行以下函数,

function loadPage() { takeInput(); processInput(); outputInput(); } 

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

选项1

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

选项#2

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

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

addEventListenersetTimeoutsetInterval 。 这是唯一的3(我认为非常令人惊讶)。

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

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

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

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(); 

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

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

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

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

JavaScript不是,通常是异步的,但它确实有异步和事件驱动的方法。

Ajax调用是一种很大的异步方法。

对于事件,我不确定您是否可以保证执行顺序,但我可能错了。

不,不是默认/标准,尽管有异步方法。 而jQuery更多地利用了异步行为。 但在每种情况下,它都是主观的,不能说“所有的JavaScript都是这个那个 ”。

方法总是按照它们被调用的顺序执行; 它们的异步意味着任何可能在另一个之前完成,即使之后被调用。

Javascript是一个单线程的野兽,所以严格来说,任务不是异步的,就像产生子线程来执行代码一样。 提供此function的机制创造了异步性的幻觉,但它仍然是单线程的。