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

相关推荐
应用市场4 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
Dfreedom.4 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
一半烟火以谋生4 小时前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest
虚行4 小时前
C#上位机工程师技能清单文档
开发语言·c#
小羊在睡觉5 小时前
golang定时器
开发语言·后端·golang
CoderCodingNo5 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
saadiya~5 小时前
ECharts 实时数据平滑更新实践(含 WebSocket 模拟)
前端·javascript·echarts
百锦再6 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
Larry_Yanan6 小时前
QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
开发语言·c++·笔记·qt·学习·ui·交互
百锦再6 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven