通过JS的setTimeout了解线程/同步性

use*_*661 4 javascript jquery

Javascript的setTimeout函数让我重新评估我对javascript的了解.今天早些时候我遇到了像这样的for循环:

for (i = 0; i < length; i++) {
    setTimeout(executeOtherCode, 5000)
}
Run Code Online (Sandbox Code Playgroud)

我期望这段代码做的是执行executeOtherCode函数,"sleep"5秒,然后继续下一次迭代.相反,我得到的是executeOtherCode同时执行长度时间.

所以根据我的理解,setTimeout是一个异步函数调用.它是否正确?然而,如果我要执行一个常规函数,让我们称之为hugeFunction(),这需要花费1分钟来执行,下一行代码将不会执行,直到该函数返回一些东西,对吗?那两个为什么不同呢?只是语言设计的选择?

我在jQuery中看到过其他函数,它们以类似的异步方式运行,比如getJSON.只是知道哪些函数被定义为异步,或者是否有某种模式来识别它们?如果是这样,什么?

Ben*_*aum 6

通常,除特殊情况外 - JavaScript按顺序同步执行.

setTimeout(executeOtherCode, 5000)
Run Code Online (Sandbox Code Playgroud)

告诉"在5秒内,运行该功能executeOtherCode".它继续运行循环,它不会"阻止"执行.

在5秒内,事件循环将注意到一个计时器(好,length计时器)已经设置并将执行它们(一个接一个).

如果希望函数在彼此延迟5秒内执行,则需要告知下一个函数在最后一个函数完成后5秒执行,此模式称为异步信号量.

一般的经验法则是,如果它执行I/O,它应该是异步的,这就是为什么AJAX是异步的(以及其他HTTP请求,如脚本标记注入)和交互事件是异步的(例如,JavaScript对点击作出反应,它不等他们).定时器(setTimeout和setInterval也是异步的).

其他一切都是同步的.

现在,一些函数可能会使用这些其他函数,但是找不到哪个函数没有灵丹妙药.只是清楚文档.大多数异步函数都有一个回调参数(比如executeOtherCode的第一个参数)但有些函数没有,有些函数接受回调但不是异步的.