美文网首页
★ 回调函数、闭包

★ 回调函数、闭包

作者: 行走的蛋白质 | 来源:发表于2019-12-17 16:01 被阅读0次
  • 普通函数和回调函数有什么区别?
  • 什么是闭包?
普通函数和回调函数主要是在调用方式上的区别:
  • 普通函数的调用:
    调用程序发出对普通函数的调用后,程序立即转向被调用函数的执行,直到被调用函数执行完毕,然后返回调用程序继续执行。
    从发出程序的角度来看普通函数的执行过程:调用函数执行 ==> 等待被调用函数执行完毕 ===> 调用函数继续执行。
  • 回调函数的调用:
    调用程序发出对回调函数的调用后,不等待被调用的回调函数执行,立即返回并继续执行调用程序。
    现象:调用程序和被调用函数同时在执行。
    当被调用函数执行完毕后,被调用函数调用某个事先准备好的函数来通知调用程序函数执行结束。这个过程就是函数回调。

大部分情况下通俗的说:在其他函数中作为参数使用的函数即为回调函数。

闭包
  • 闭包就是指有权访问另一个函数作用域中变量的函数
  • 理解闭包的关键:外部函数被调用之后其变量对象本应该被销毁,但是闭包的存在使我们仍然可以访问外部函数的变量对象
  • 简单说:函数 A 中有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。

示例如下:

function fun1() {
    let a = 1
    window.fun2 = function() {
        console.log(a)
    }
}
fun1()
fun2() // 1

在 JS 中闭包存在的意义就是让我们可以间接访问函数内部的变量。

  • 经典面试题:循环中使用闭包解决 var 定义变量的问题
for(var i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i)
    }, i * 1000)
}
// 结果输出 5 个 6

因为 setTimeout 是一个异步函数,所以会先把循环执行完毕,这时候 i 就是 6 了,所以会输出 5 个 6

解决方案如下: 更多解决方案请戳...

// 1. 闭包 首先使用立即执行函数将 i 传入函数内部,这个时候就会被固定在参数 j 上不会改变,当下次执行 timer 这个闭包的时候,就可以使用外部函数的变量 j 
for(var i = 1; i <= 5; i++) {
    (function(j) {
        setTimeout(function timer() {
            console.log(j)
        }, j * 1000)
    })(i)
}
// 2. 使用 setTimeout 的第三个参数
for(var i = 1; i <= 5; i++) {
    setTimeout(function timer(j) {
        console.log(j)
    }, i * 1000, i)
}
// 3. 使用 let 来定义 i 解决问题
for(let i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i)
    }, i * 1000)
}

相关文章

  • 【Swift】关于闭包的几种写法

    闭包 闭包是一个特殊的函数,经常用于回调 简单举个例子:在方法中定义闭包实现回调传值 尾随闭包:1.如果闭包是函数...

  • ★ 回调函数、闭包

    普通函数和回调函数有什么区别? 什么是闭包? 普通函数和回调函数主要是在调用方式上的区别: 普通函数的调用:调用程...

  • Swift基础语法-闭包,闭包函数回调,尾随闭包,闭包捕获值,循

    本节知识点 闭包的基本概念 闭包基本使用 闭包表达式作为回调函数 闭包的多种写法(尾随闭包) 闭包表达式优化 闭包...

  • 4 iOS类微信日志2018-01-13

    Swift 闭包的使用 步骤: 1. 声明闭包 2. 声明闭包的别名属性 3. 设置回调函数 4. 调用闭包 声明...

  • Day4 闭包

    闭包允许函数访问定义时的词法作用域回调函数基本上都是闭包模块利用闭包隔离变量,暴露公共API(也会伴随IIFE立即...

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • 闭包和回调函数

    闭包 函数A内定义了一些变量和内部函数B,而且在B中使用了A的变量,然后返回函数B,那么B就称为A的闭包(闭包也是...

  • 2018-01-05 arrow 函数(ES6)、测量一个Ja

    1 给回调函数传递参数 在默认情况下,你无法将参数传给回调函数,如下: 你可以采取JavaScript闭包的优点来...

  • 闭包--Closure

    学习Ajax模式之前,需要对闭包和回调函数的概念有所理解. 闭包的概念 当一个函数内调用另一个函数,同时这个函数引...

  • go 基本函数

    多返回值函数 递归 函数类型 type 回调函数 和多态(强大) 匿名函数 与 闭包 关键字defer(defer...

网友评论

      本文标题:★ 回调函数、闭包

      本文链接:https://www.haomeiwen.com/subject/zqosnctx.html