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

相关推荐
☆璇42 分钟前
【数据结构】排序
c语言·开发语言·数据结构·算法·排序算法
我要成为c嘎嘎大王42 分钟前
【C++】初识C++(1)
开发语言·c++
良木林1 小时前
JavaScript书写基础和基本数据类型
开发语言·前端·javascript
艾莉丝努力练剑4 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
工业甲酰苯胺7 小时前
TypeScript枚举类型应用:前后端状态码映射的最简方案
javascript·typescript·状态模式
倔强青铜38 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian8 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼9 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上9 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang9 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab