setTimeout是一个很好的解决scheme,使用JavaScript做asynchronous函数?

在网上search关于asynchronous函数,我发现许多使用setTimeout来完成这项工作的文章:

window.setTimeout(function() { console.log("second"); }, 0); console.log("first"); 

输出:

 first second 

这是有效的,但是最好的做法是?

谢谢

setTimeout(function(){...}, 0)只需将当前调用堆栈执行完成后的代码运行即可。 这可能对某些事情有用 。

所以是的,它是asynchronous的,因为它打破了同步stream程,但实际上并不是在单独的线程上同时执行。 如果你的目标是后台处理,看看webworkers 。 还有一种使用iframe进行后台处理的方法。

更新

为了进一步阐明,并发/后台和asynchronous之间是有区别的。 当代码是asynchronous的,只是意味着它不是按顺序执行的。 考虑:

 var foo = 'poo'; setTimeout(function() {foo = 'bar'}, 100); alert(foo); 

值“poo”将被警告,因为代码不是按顺序执行的。 “bar”值是asynchronous分配的。 如果您需要在发生asynchronous分配时提醒foo的值,请使用callback:

 /* contrived example alert */ var foo = 'poo'; function setFoo(callback) { setTimeout(function(){ foo = 'bar'; callback(); }, 100); }; setFoo(function() { alert(foo); }); 

所以是的,上面发生了一些asynchronous事件,但是这一切都发生在一个线程中,所以没有任何性能优势。

当一个操作需要很长时间时,最好在后台进行。 在大多数语言中,这是通过在新的线程或进程上执行操作来完成的。 在(浏览器)JavaScript中,我们没有能力创build新的线程,但可以使用webworkers或iframes。 由于这个在后台运行的代码打破了事物的顺序stream,所以它是asynchronous的。

TLDR :所有后台/并发代码asynchronous发生,但不是所有asynchronous代码都同时发生。

另请参阅 : 以Layman的术语理解asynchronous代码

 var foo = 'poo'; setTimeout(function() {foo = 'bar'}, 100); alert(foo); 

对@ tybro0103的答案进行了一个小的修正,“poo”的值不会被警告,因为代码不是按顺序执行的。 “bar”值是asynchronous分配的,只会在100毫秒后执行,届时警报将会被执行。

foo的价值保持不变。