JavaScript闭包

  • 闭包:内层函数+外层函数的变量,能够访问记住其外部函数作用域中的变量,即使外部函数已经执行完毕,这是因为闭包函数捕获了外部函数的执行环境
  • 弊端:可能导致内存泄漏
  • 应用于:
    1.数据私有化和封装:闭包可以用来创建私有变量
    2.函数工厂:闭包可以用来生成定制的函数,比如记忆函数,柯里化函数
    3.回调函数:闭包可以用来在回调函数中访问外部函数的变量
    4.循环中的回调函数:在循环中使用闭包可以解决变量作用域的问题

1.简单写法

function outer() {
     let a = 10;
     function fn() {
         console.log(a);
//输出结果:10
      }
      fn()
}
outer()

2.常见的闭包形式,外部函数可以访问使用函数内部的变量

function outers() {
    let a = 10;
    function fn() {
        console.log(a);
//输出结果:10
     }
     return fn
}
// outers()===fn===function fn(){}
const fun = outers()
// const fun=function fn(){}
fun()//调用函数,外面要使用a=10

3.数据私有化和封装

function createCounter() {
    let count = 0;
//定义了一个函数createCounter()返回了一个对象,对象里有三种方法,每个方法都能操作外部的count
    return {
         increment: function () {
             count++
          },
          decrement: function () {
              count--
          },
          getCount: function () {
              return count
          }
     }
}
const myCounter = createCounter();
myCounter.increment();
myCounter.increment();
//调用 myCounter 对象上的 increment 方法两次,使 count 变量的值增加 2
 console.log(myCounter.getCount())
//输出结果:2

4.在循环中回调函数

for (let i = 0; i < 5; i++) {
     setTimeout(function () {
          console.log(i);
//输出结果:0 1 2 3 4
      }, i * 1000)
}
//setTimeout()回调函数是通过闭包访问的,每次循环都会创建一个新的块级作用域,所以每个回调函数都能访问到正确的i值

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值