16

考虑正在执行以下函数,

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

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

选项1

  1. 采取输入();
  2. 进程输入();
  3. 输出输入();

选项#2

  1. 输出输入();
  2. 进程输入();
  3. 采取输入();
4

6 回答 6

20

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

addEventListener, setTimeout, setInterval. 这些是仅有的 3 个(我认为这非常令人惊讶)。

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

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

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

于 2013-02-28T16:51:40.347 回答
10

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();
于 2013-02-28T16:53:31.253 回答
5

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

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

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

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

于 2015-10-20T19:43:42.970 回答
1

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

Ajax 调用是主要的异步方法。

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

于 2013-02-28T16:53:46.270 回答
0

Javascript 是一个单线程的野兽,所以严格来说,任务并不是像人们想象的那样是异步的,因为它会产生子线程来执行代码。提供这种机制的机制会产生异步的错觉,但它仍然是单线程的。

于 2013-02-28T16:55:18.630 回答
0

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

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

于 2013-02-28T16:52:11.090 回答