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

相关推荐
拉不动的猪2 小时前
移动端调试工具VConsole初始化时的加载阻塞问题
前端·javascript·微信小程序
大金乄5 小时前
封装一个vue2的elementUI 表格组件(包含表格编辑以及多级表头)
前端·javascript
Lee川6 小时前
解锁 JavaScript 的灵魂:深入浅出原型与原型链
javascript·面试
swipe7 小时前
从原理到手写:彻底吃透 call / apply / bind 与 arguments 的底层逻辑
前端·javascript·面试
Lee川9 小时前
探索JavaScript的秘密令牌:独一无二的`Symbol`数据类型
javascript·面试
Lee川9 小时前
深入浅出JavaScript事件机制:从捕获冒泡到事件委托
前端·javascript
光影少年9 小时前
async/await和Promise的区别?
前端·javascript·掘金·金石计划
codingWhat9 小时前
如何实现一个「万能」的通用打印组件?
前端·javascript·vue.js
前端Hardy12 小时前
别再无脑用 `JSON.parse()` 了!这个安全漏洞你可能每天都在触发
前端·javascript·vue.js
前端Hardy12 小时前
别再让 `console.log` 上线了!它正在悄悄拖垮你的生产系统
前端·javascript·vue.js