Javascript是同步(阻塞)还是asynchronous(非阻塞)默认情况下

我想抓住Javascriptasynchronous函数和callback。

我陷入了callback函数的概念,在某些地方我正在阅读它们:它们被用来顺序执行代码(主要在jQuery的上下文中,例如animation)和一些地方,特别是在Nodejs的上下文中; 它们用于并行执行asynchronous并避免代码的阻塞。

那么这个专题的一些专家可以澄清这一点,并清除我脑海中的这个模糊(例子??)。 所以我可以使用callback函数

或者完全取决于你在哪里调用/在你的代码中放置一个callback函数?

谢谢,

PS:我很害怕这个问题会很接近主观,但我仍然可以期待具体的答案(也许是一些例子)

编辑:其实这是互联网的例子,使我ambigous:

function do_a(){ // simulate a time consuming function setTimeout( function(){ console.log( '`do_a`: this takes longer than `do_b`' ); }, 1000 ); } function do_b(){ console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' ); } do_a(); do_b(); 

结果

 `do_b`: this is supposed to come out after `do_a` but it comes out before `do_a` `do_a`: this takes longer than `do_b` 

当JS是顺序的时候,do_b应该总是在do_a后面根据我的理解。

JavaScript的核心很大程度上是同步的,在完成之前,函数完全完成它们的任务。 在AJAX出现之前,实际上只有setTimeout和setInterval提供了asynchronous行为。

但是,很容易忘记事件处理程序是有效的asynchronous代码。 附加一个处理程序不会调用处理程序代码,并且该代码将在未来某个不可知的时间才会被执行。

然后来到AJAX,调用服务器。 这些调用可以configuration为同步,但开发人员通常更喜欢asynchronous调用,并使用callback方法来实现它们。

然后,我们看到了JS库和工具包的泛滥。 这些努力均匀化不同的浏览器的东西的实现,并build立在asynchronous代码的callback方法上。 你也开始看到像数组迭代或CSS查询结果处理等更多的同步callback。

现在,我们看到了延期和承诺。 这些是表示长时间运行操作的值的对象,并提供用于处理该值的API。

NodeJS倾向于对许多事物采取asynchronous的方法; 这是事实。 然而,这更像是一个devise决定,而不是JS的任何固有的asynchronous性质。

Javascript始终是一种同步(阻塞)单线程语言,但是我们可以通过编程使JavaScript成为asynchronous。

同步码:

 console.log('a'); console.log('b'); 

asynchronous代码:

 console.log('a'); setTimeout(function() { console.log('b'); }, 1000); setTimeout(function() { console.log('c'); }, 1000); setTimeout(function() { console.log('d'); }, 1000); console.log('e'); 

这输出:aebcd

在节点长时间运行的过程中,使用process.nextTick()来排队函数/callback。 这通常在节点的API中完成,除非你的程序(在api之外)有阻塞的东西,或者长时间运行的代码,那么它不会对你有太大的影响。 下面的链接应该更好地解释它,然后我可以。

howtonode process.nextTick()

jQuery的AJAX也采取callback,例如它编码不等待服务器响应,然后再移动到下一个代码块。 它只是记住在服务器响应时运行的函数。 这基于浏览器公开的XMLHTTPRequest对象。 XHR对象会记住在响应返回时要callback的函数。

一旦调用堆栈为空(下一个可用的空闲时钟),javascript的setTimeout(fn, 0)将会运行一个函数,这个函数可以用来创build类似于asynchronous的特性。 setTimeout(fn,0)在stackoverflow问题

总结一下javascript的asynchronousfunction与javascript本身的编程环境同样重要。 除非使用一些API /脚本,否则只要使用大量的函数调用和callback就不会获得任何魔力。

JQuery的推迟对象是jQuery的asynchronousfunction的另一个好链接。 谷歌search可能会find你的信息如何延迟jQuery的作品也为更多的见解。