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

当我们说到闭包,在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词法作用域产生的一个自然的结果,我们无需畏惧它,要尝试着理解并去拥抱它。其实就是一个函数能够记住并访问其所在的词法作用域中的变量,这样就产生了闭包,闭包的作用是延长了变量的生命周期,阻止了浏览器垃圾回收机制去立即回收变量。

相关推荐
mCell8 小时前
GSAP ScrollTrigger 详解
前端·javascript·动效
gnip8 小时前
Node.js 子进程:child_process
前端·javascript
codingandsleeping14 小时前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
白水清风15 小时前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
用户221520442780015 小时前
new、原型和原型链浅析
前端·javascript
阿星做前端15 小时前
coze源码解读: space develop 页面
前端·javascript
叫我小窝吧15 小时前
Promise 的使用
前端·javascript
前端康师傅17 小时前
JavaScript 作用域
前端·javascript
云枫晖17 小时前
JS核心知识-事件循环
前端·javascript
eason_fan18 小时前
Git 大小写敏感性问题:一次组件重命名引发的CI构建失败
前端·javascript