4

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

for (i = 0; i < length; i++) {
    setTimeout(executeOtherCode, 5000)
}

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

所以据我了解,setTimeout 是一个异步函数调用。这个对吗?然而,如果我要执行一个常规函数,我们称之为 hugeFunction(),它需要 1 分钟才能执行,下一行代码在该函数返回之前不会执行,对吗?那么为什么两者不同呢?只是语言设计的选择?

我已经看到 jQuery 中的其他函数以类似的异步方式运行,例如 getJSON。仅仅是知道哪些函数被定义为异步的问题,还是有某种模式可以识别它们?如果是这样,是什么?

4

1 回答 1

6

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

setTimeout(executeOtherCode, 5000)

正在告诉“在 5 秒内,运行该功能executeOtherCode”。它继续运行循环,它不会“阻止”执行。

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

如果你想让函数彼此延迟 5 秒执行,你需要告诉下一个函数在上一个函数完成后 5 秒执行,这种模式称为异步信号量。

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

其他一切都是同步的。

现在,某些功能可能会使用这些其他功能,但没有灵丹妙药来找出哪个是哪个。只需清除文档即可。大多数异步函数都有一个回调参数(如 executeOtherCode 的第一个参数),但有些没有,有些函数接受回调但不是异步的。

于 2013-06-22T03:01:33.813 回答