JavaScript-闭包的本质-可能会颠覆你的理解

本文探讨了闭包的形成条件,指出其并不局限于函数嵌套,通过非函数嵌套和传统函数返回函数的示例,说明闭包如何保持对外部作用域变量的引用,实现变量常驻内存。闭包在内存中以对象形式存在,即使与原始变量分离,仍能影响其生命周期。
摘要由CSDN通过智能技术生成

前言:闭包形成的条件,作用域嵌套,内部作用域引用外部作用域变量,形成变量常驻内存。

利用非函数嵌套创建一个闭包,上代码:

if (true) {
      let a = 1
      window.B = function () {
        return ++a
      }
    }
    console.log(B());
    console.log(B());
    console.log(B());
    console.log(B());
    console.log(B());
    console.log(B());
//最后打印结果是:2,3,4,5,6,7

再看一个传统的经典闭包demo:

function a() {
      var count = 1

      return function b() {
        count++
        console.log(count);
      }
      b()
    }
    var c = a()
    c()
    c()
    c()
    c()
    c()
    c()
//打印结果:2,3,4,5,6,7

第一段代码没有使用函数嵌套的形式,同样实现了函数嵌套的结果,达到了延长外部作用域变量的声明周期的目的。

所以闭包的形成和是否使用函数嵌套没有关系,关键在于引用变量的环境是否有作用域嵌套。

补充:

  1. 闭包在内存里也是以对象的形式存在
  2. 闭包保存的变量对象也在执行上下文里
  3. 非函数嵌套形式形成的闭包无法在浏览器里查看到,但实践证明确实存在
  4. 形成闭包后和原先声明的变量已经没有关系了,闭包是对象,原有变量可能是数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值