javascript单线程的异步与回调怎么理解?

因为 JavaScript 是单线程的,在某一时刻内只能执行特定的一个任务,并且会阻塞其它任务执行。那么对于类似 I/O 等耗时的任务,就没必要等待他们执行完后才继续后面的操作。在这些任务完成前,JavaScript 完全可以往下执行其他操作,当这些耗时的任务完成后则以回调的方式执行相应处理。这些就是 JavaScript 与生俱来的特性:异步与回调。

这段话我难以理解,我的理解是:
单线程在一个时刻只能执行一个任务,那么对于类似 I/O 等耗时的任务,就没必要等待他们执行完后才继续后面的操作。在这些任务完成前,JavaScript 完全可以往下执行其他操作 这句话不是很矛盾吗?

阅读 3.6k
5 个回答
  • 首先,I/O 等操作并不是 JavaScript 线程去执行的,而是系统线程去做的,做完了通知你完成了;如文件读写,是 JavaScript 线程调用浏览器 API,浏览器调用系统 API,完成后通知回来。
  • 所以,你可以在调用 I/O 操作时,设置好回调函数即可,然后 JavaScript 线程可以继续做别的事情,等系统调用完成后,浏览器会通知 JavaScript 执行回调
  • 最后,建议详细阅读:宏任务和微任务

计算机五大组成:

  • 控制器
  • 运算器
  • 存储器
  • 输入
  • 输出

其中控制器和运算器组成我们常说的 CPU,输入/输出就是 I/O。跑在 CPU 上的程序和 I/O 操作本来就可以互不依赖啊。

打个比方吧,你有几个任务要做:
1.打电话问甲方需求,甲方要思考五分钟再给你答复。
2.写PPT1,这个不需要甲方结果就可以写。
3.写PPT2,这个需要甲方的需求才能写。
对于这三个任务,你可以通过以下方式节省时间:
1.先打电话
2.写PPT1
3.几分钟后执行了电话的回调
4.根据回调,写PPT2
至于回调,在你(JS)放下电话的那一刻(执行了请求),你的秘书(浏览器)就知道了要等着甲方(服务器)的电话,在你的秘书(浏览器)接到电话后,会将信息传递给你(JS)。

JS 是单线程的。
浏览器可不是啊。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题