在理解闭包之前,有个重要的概念需要先了解一下,就是 js 执行上下文。
我们当作 执行上下文 是当前代码执行的一个环境与作用域。
闭包是 js 创建函数就自带的一种机制
它是这样工作的,无论何时声明新函数并将其赋值给变量,都要存储函数定义和闭包。闭包包含在函数创建时作用域中的所有变量,它类似于背包。
函数定义附带一个小背包,它的包中存储了函数定义创建时作用域中的所有变量。
案例
1: function createCounter() {
2: let counter = 0
3: const myFunction = function() {
4: counter = counter + 1
5: return counter
6: }
7: return myFunction
8: }
9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
13: console.log('example increment', c1, c2, c3)
你可能会问,是否有任何函数具有闭包,甚至是在全局范围内创建的函数?答案是肯定的。在全局作用域中创建的函数创建闭包,但是由于这些函数是在全局作用域中创建的,所以它们可以访问全局作用域中的所有变量,闭包的概念并不重要。
当函数返回函数时,闭包的概念就变得更加重要了。返回的函数可以访问不属于全局作用域的变量,但它们仅存在于其闭包中。
当一个函数被创建并传递或从另一个函数返回时,它会携带一个背包。背包中是函数声明时作用域内的所有变量。
闭包的不同理解
本质就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。
优点是私有化数据,在私有化数据的基础上保持数据,
内部的变量不会被自动回收掉,使用过多,容易内存溢出
缺点使用不恰当会导致内存泄漏,在不需要用到的时候及时把变量置为null
闭包的应用是非常广泛的,比方我们常见的节流,防抖,
**(1)什么是闭包: **
闭包是指有权访问另外一个函数作用域中的变量的函数。
优点是私有化数据,在私有化数据的基础上保持数据,缺点使用不恰当会导致内存泄漏,在不需要用到的时候及时把变量置为null
闭包的应用是非常广泛的,比方我们常见的节流,防抖
因篇幅问题不能全部显示,请点此查看更多更全内容