JavaScript 基础知识回顾与复习---闭包

本文解释了JavaScript中闭包的概念,它是函数能访问其所在词法作用域的特性,延长了变量生命周期。通过示例代码展示了闭包的工作原理和实际应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们说到闭包,在JavaScript中闭包是一个让人难以理解甚至说是一个近乎神话的概念。闭包往往也是面试必考的题目,如果能够掌握闭包对我们自己来说那也是一种极大的提升。在学习的过程中不要害怕闭包,闭包并不是一个新的语法或者模式,他只是基于词法作用域书写代码时产生的自然结果,我们需要做的就是去识别、拥抱和影响闭包的思维。

这里先给出闭包的概念,什么是闭包?这个概念来自于《你不知道的JavaScript上卷》一书,所谓闭包:当函数可以记住并访问所在词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

直接上代码:

function foo(){
    var a = 2;
    function bar(){
        console.log(a)
    }
    return bar
}
var baz = foo()
baz() // 2

以上代码就是一个闭包,试着分析一下这段代码都干了写什么

  • foo函数作用域内部声明了变量a,其内部又嵌套函数bar。
  • 在bar函数内部访问了其作用域上的变量a,它在自己身上没找到,继续往上在foo身上找到了变量a。
  • 在foo函数内部将bar函数作为返回值进行返回。
  • 将foo函数赋值给变量baz,最后调用了baz,输出结果为2。

将foo赋值给baz,实际上是直接引用了内部函数bar,而bar内部访问了变量a。通常来说,foo执行完之后,整个内部作用域都会被引擎销毁,浏览器是有一个垃圾回收机制的。而闭包正好阻止了这件事情的发生,它的内部作用域依然存在,因为bar还在使用,它访问了foo内部的变量a,bar还持有对foo作用域的引用,这个引用就是闭包,什么是闭包?这就是闭包。闭包的神奇之处在于它可以延长变量的生命周期

当函数在别处被调用是,也可以观察到闭包

function foo2(){
      var a = 3;
      function baz2(){
        console.log(a)
      }
      bar2(baz2)
    }
    function bar2(fn){
      fn();
    }
    foo2() // 3

传递函数也可以是简介的

// 传递函数也可以是间接的
    var fn;
    function foo3(){
      var a = 4;
      function baz3(){
        console.log(a)
      }
      fn = baz3
    }
    function bar3(){
      fn()
    }
    foo3()
    bar3() // 4

以上示例代码均来自《你不知道的JavaScript上卷》一书

总结一下,闭包其实就是我们在写代码时基于JavaScript词法作用域产生的一个自然的结果,我们无需畏惧它,要尝试着理解并去拥抱它。其实就是一个函数能够记住并访问其所在的词法作用域中的变量,这样就产生了闭包,闭包的作用是延长了变量的生命周期,阻止了浏览器垃圾回收机制去立即回收变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值