以为回调函数是同步的(js的问题)

回调函数可以用来处理 JavaScript 的异步操作,但是选用 Promise、async/await 更好,因为多重回调函数会导致回调地狱

回调函数不是**同步的**,它是延时操作执行完毕后会被调用的一个函数。

比如全局方法 "setTimeout" ,它第一个参数就是一个回调函数,第二个参数是等待的时间(以毫秒为单位),如下:

html 复制代码
function callback() {
​​    console.log("I am the first");
​​}
​​setTimeout(callback, 300);
​​console.log("I am the last");
​​// output
​​// I am the last
​​// I am the first

300毫秒之后,回调函数 callback 会被调用。但是在它完成前,剩下的代码会继续往下运行,所以 "I am the last" 会被先打印出来。

开发者常犯的一个错误是误以为回调函数是同步的。比如,他们会把回调函数的返回值用在其他操作上。

例如下面这个错误:

html 复制代码
function addTwoNumbers() {
​​    let firstNumber = 5;
​​    let secondNumber;
​​    setTimeout(function () {
​​        secondNumber = 10;
​​    }, 200);
​​    console.log(firstNumber + secondNumber);
​​}
​​addTwoNumbers();
​​// NaN

会输出 "NaN" ,因为 "secondNumber" 还未被赋值。在 "firstNumber + secondNumber" 被执行的时候,"secondNumber" 还没有被赋值,因为 "setTimeout" 函数要在 "200毫秒" 后才调用回调函数。

最好的解决办法是把剩下的代码放在回调函数里去执行:

html 复制代码
function addTwoNumbers() {
​​    let firstNumber = 5;
​​    let secondNumber;
​​    setTimeout(function () {
​​        secondNumber = 10;
​​        console.log(firstNumber + secondNumber);
​​    }, 200);
​​}
​​addTwoNumbers();
​​// 15
相关推荐
晓得迷路了11 小时前
栗子前端技术周刊第 106 期 - pnpm 10.21、Node.js v25.2.0、Bun v1.3.2...
前端·javascript·html
码上成长11 小时前
<script setup> 实战模式:大型组件怎么拆?
开发语言·javascript·vue.js
花归去11 小时前
【Vue3】 中的 【unref】:详解与使用
前端·javascript·vue.js
小霖家的混江龙11 小时前
巧用辅助线,轻松实现类拼多多的 Tab 吸顶效果
前端·javascript·react.js
A***279511 小时前
前端路由管理最佳实践,React Router
前端·react.js·前端框架
恋猫de小郭12 小时前
Snapchat 开源全新跨平台框架 Valdi ,一起来搞懂它究竟有什么特别之处
android·前端·flutter
艾小码12 小时前
还在为异步组件加载烦恼?这招让你的Vue应用更丝滑!
前端·javascript·vue.js
九河_12 小时前
解决pip install gym==0.19.0安装失败问题
开发语言·python·pip·gym
红豆诗人12 小时前
C语言进阶知识--文件操作
c语言·开发语言·文件操作
麦麦鸡腿堡13 小时前
Java绘图技术
java·开发语言