4. 闭包概念
leezozz 1/8/2023 js
# 闭包:
闭包:函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。
可以在另一个作用域中调用一个函数的内部函数并访问到该函数的作用域中的成员
闭包的好处:延长了外部函数的它内部变量的作用范围
函数作为返回值
const fun = () => {
let msg = '123'
return () => {
console.log('msg', msg)
}
}
const make = fun()
make()
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
once函数:
const once = (fn) => {
let done = false
return function() {
// return () => {
if(!done) {
done = true
return fn.apply(this, arguments)
}
}
}
const pay = once((item) => {
console.log('支付' + item + '元')
})
// 只会执行一次
pay(8)
pay(8)
pay(8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 对于JS中的变量存储机制的结论: 对于原始类型,数据本身是存在栈内,对于对象类型,在栈中存的只是一个堆内地址的引用
- 栈中的变量在函数调用结束后,就会消失。 这也正是栈的特点:无需手动管理、轻量、函数调时创建,调用结束则消失
- 栈是内存中一块用于存储局部变量和函数参数的线性结构,遵循着先进后出的原则
- 闭包变量并没有保存在栈中,而应该保存在堆中
- 闭包的本质:函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是堆上的作用域成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员