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

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

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

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

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" 会被先打印出来。

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

例如下面这个错误:

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毫秒" 后才调用回调函数。

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

function addTwoNumbers() {
​​    let firstNumber = 5;
​​    let secondNumber;
​​    setTimeout(function () {
​​        secondNumber = 10;
​​        console.log(firstNumber + secondNumber);
​​    }, 200);
​​}
​​addTwoNumbers();
​​// 15

相关推荐

  1. 以为函数同步js问题

    2023-12-11 20:16:01       87 阅读
  2. 函数介绍

    2023-12-11 20:16:01       38 阅读
  3. C# 中函数

    2023-12-11 20:16:01       43 阅读
  4. js中将地狱改装成promise方式函数

    2023-12-11 20:16:01       54 阅读
  5. js 函数如何追加参数

    2023-12-11 20:16:01       31 阅读
  6. sqlite - sqlite3_exec - c++函数处理

    2023-12-11 20:16:01       73 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 20:16:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 20:16:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 20:16:01       87 阅读
  4. Python语言-面向对象

    2023-12-11 20:16:01       96 阅读

热门阅读

  1. K8S学习指南-minikube的安装

    2023-12-11 20:16:01       49 阅读
  2. angular material mat-error 失效不展示

    2023-12-11 20:16:01       55 阅读
  3. CSS height auto 过渡

    2023-12-11 20:16:01       56 阅读
  4. 常用的C语言宏定义

    2023-12-11 20:16:01       63 阅读
  5. 牛客挑战赛 B - 树上博弈 -- 题解

    2023-12-11 20:16:01       71 阅读
  6. Python:合并两个PDF文件为一个PDF

    2023-12-11 20:16:01       57 阅读
  7. 涂卡——位运算

    2023-12-11 20:16:01       56 阅读
  8. 【力扣】刷题备忘录-动归-96. 不同的二叉搜索树

    2023-12-11 20:16:01       70 阅读
  9. SCAU:18051 勾股数

    2023-12-11 20:16:01       58 阅读