JavaScript中的闭包
一、闭包的基本概念:
闭包就是能够读取其他函数内部变量的函数。
二、JavaScript产生闭包的原因:
1.作用域链:JavaScript的作用域分为全局作用域、函数作用域、块级作用域。在JavaScript中,外部作用域无法直接访问内部作用域,内部作用域可以直接访问外放作用域。在JavaScript中,自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是在执行的地方;在所有情况下都是如此,不仅仅是在闭包的情况下。作用域一层层嵌套,形成作用域链。
2.垃圾回收机制:JavaScript拥有自动的垃圾回收机制,当一个值,在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。函数的执行上下文,在执行完毕之后,生命周期结束,那么该函数的执行上下文就会失去引用。其占用的内存空间很快就会被垃圾回收器释放。可是闭包的存在,会阻止这一过程。
三、闭包形成的条件:
1.函数嵌套
2.内部函数引用外部函数的局部变量
四、闭包分为两种情况:
1.函数作为返回值
// 函数作为返回值
function create() {
const a = 100
return function () {
console.log(a)
}
}
const fn = create()
const a = 200
fn() // 100
function F1() {
var a = 100
return function () {
console.log(a)
}
}
function F2(f1) {
var a = 200
console.log(f1())
}
var f1 = F1()
F2(f1)
// 100
// undefined
2.函数作为参数
// 函数作为参数被传递
function print(fn) {
const a = 200
fn()
}
const a = 100
function fn() {
console.log(a)
}
print(fn) // 100
五、实际开发中闭包的应用:
1.闭包作为回调函数,做事件处理,比如截流函数和防抖函数
2.Promise中用到了闭包
3.创建私有变量,减少全局变量,防止变量名污染
六、清除闭包的方法:
将不需要的函数名赋值为null
七、总结:
1.解释闭包:一个函数执行完后,它的作用域会被清理,它占用的内存会被回收。闭包是一个函数内部的子函数,它需要访问它上级函数作用域中的变量,这时上级函数执行完后其作用域不会被清理,会一直缓存在内存中,直到闭包不存在为止。
2.闭包的作用:闭包可以缓存上级作用域,使函数外部可以通过闭包访问函数内部的变量。