2013-02-28 73 views
14

考虑执行以下功能,JavaScript函数是否是异步的?

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

在什么样的顺序,他们会被执行(我有read它遵循栈所以选项2将是答案)?

选项#1

  1. takeInput();
  2. processInput();
  3. outputInput();

选项#2

  1. outputInput();
  2. processInput();
  3. takeInput();

回答

16

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

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

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

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

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

+4

唯一的3?那么,所有其他的呢? – Pointy 2013-02-28 16:54:39

+1

还有哪些?没有其他的。分配一个onclick或onreadystatechange (例如)只是'addEventListener'的一个混蛋。 – Halcyon 2013-02-28 16:56:07

+2

XHR呢?那么Node.js中所有可用的API呢? – Pointy 2013-02-28 16:58:03

0

不,默认情况下不是/作为标准,虽然有异步方法。而且jQuery更使用异步行为。但在每种情况下,这是主观的,不能说“所有的JavaScript是这个”。

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

8

JavaScript函数是异步的吗?

有些是,大部分都没有。

在什么样的顺序,他们会被执行

他们将在调用它们的顺序执行。由于它们都是从同一个函数中调用的,所以会以简单的线性顺序。

如果它们中的任何一个是以异步方式编写的,那么它们可能不会以相同的顺序完成其所有活动。对于example

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

所以C()会一直等待B()来使用,只要在B中所有的代码是同步完成?所以b可以包含1000行syncronous代码&c仍然会在b之后执行而不是?就是这个突出的操作顺序时的代码是父函数中异步确保^^ – Vincent 2015-01-15 10:36:30

+0

很好的例子。如果我们开始在b,c中添加异步代码,将会成为一个屠宰场。到那个,我们应该使用承诺:!d – 2016-03-07 13:35:15

1

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

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

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

0

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

+1

异步并行= – Quentin 2013-02-28 17:00:15

1

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

所以,JavaScript引擎保持在一个时间,在这个过程中运行此一行代码,如果有任何事件/ HTTP请求火灾,浏览器把它们放入事件队列。所以,重点是JavaScript引擎不会处理队列中的事件,直到执行堆栈为空。 当引擎执行堆栈时,它会定期查看是否有任何队列中的当前事件的事件处理程序,并类似地为该处理程序创建执行上下文并运行其中的代码。 因此,整个过程仅仅是同步的,而异步只是由浏览器的其他部分(如渲染引擎或http引擎)处理,而JavaScript引擎继续同步运行代码。

所以,你的情况, 从哪个方面功能loadpage被调用,它的执行上下文被创建并与放置在堆栈的顶部。然后,它调用输入输入函数,它的exec。上下文被创建,并且其他函数上下文将不会被创建并被放置在堆栈中,直到takeinput上下文从执行堆栈弹出。 因此,正确的顺序将是takeinput,processinput和outputinput。

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