前端学习笔记03——JS闭包

96 阅读3分钟

JS闭包学习笔记

   JavaScript中的闭包,相信学前端的小伙伴都很熟悉这个词,但是被问及什么是闭包,却只能回答上来一点概念相关,所以今天写一篇学习日整理一些在网上所学习到的有关闭包的知识。

1.什么是闭包

   首先,我们需要了解js中的变量分为全局变量和局部变量。一个函数内部可以访问到函数内定义的变量(即局部变量)和全局变量,但是外部不能访问到函数内部的变量,当函数内部嵌套了函数时,里面的函数也是可以访问到外部函数定义的变量的,这就是了解闭包的前提知识之一。那么,到底什么是闭包呢?看了各种关于闭包的概念都比较抽象,也是各不尽相同的。但是,闭包都会有有以下两个概念:

  1. 函数嵌套函数;
  2. 内部函数可以访问到外部函数的变量; 在知乎‘「每日一题」JS 中的闭包是什么?’中一个高赞回答提到这样一个概念:

「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。

用自己的话总结一下,就是一个函数内部嵌套一个函数,子函数可以访问到外部函数中的变量和参数,这样的一整个函数就是一个闭包。 至此,面试问道的闭包的概念到这就差不多了。这就是一个简单的闭包:

var add = function () {
    var counter = 0;
    return function () {return counter += 1;}
};

add();

2.闭包的作用是什么

  那么闭包在我们的开发环境中有什么作用呢?我们在什么时候会需要用到闭包呢?
  我们都知道,在一般情况下,我们调用完函数之后,在他里面的变量是会被立即回收的。但是在一个闭包里面,因为该变量还被函数里面的函数引用着,所以并不会被销毁。
  此外,全局变量相较于函数内部的变量。全局变量是大家都可以调用的,所以很容易发生改变;但是函数内部的变量在外部是访问不到的,我们只能通过闭包里面的函数来调用这个变量,并且刚才有提到到这个变量是不会销毁的,我们下次还可以继续调用。
  这样,我们可以大致地总结出闭包地作用:当我们希望一个变量只能通过某一个函数调用才更改,并且希望这个变量保存着的时候,我们就可以使用闭包。 同理,因为这个变量是我们希望它保存着的,所以闭包并不会引起内存泄露
  这就是关于闭包的一些学习笔记,面试的时候闭包通常会问的三个问题:什么是闭包?闭包有什么作用?闭包会不会引起内存泄漏?现在都有了一定的了解。后续有新的内容会继续改进哦!