JS中的闭包
闭包(closure)就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成 “ 定义在一个函数内部的函数”。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。(闭包的最典型的应用是实现回调函数(callback) )
1.全局环境
- 全局环境不会被回收
- 全局变量在函数内也是有效的
let title = 'xxx'
const test = () => {
console.log(title)
}
2.函数作用域
- 函数调用之后会产生函数作用域
function test1() {
let a1 = 1
function test2() {
let a2 = 2
}
//在test1里面不能访问到a2
}
- 函数每次调用都会创建新的执行上下文
function test1() {
let n = 1
function test2() {
console.log(++n)
}
test2()
}
- 如果要实现n的累加,必须使得数据被使用,这样内存空间不会被释放
function test1() {
let n = 1
return function() {
console.log(++n)
}
}
let a = test1()
a()
a()
//可以实现累加
错误示例
function test1() {
let n = 1
return function() {
let m = 1
function test2(){
console.log(++m)
}
test2()
}
}
let b = test1()
b() //2
b() //2
//因为test2没有被外部引用
正确示例
function test1() {
let n = 1
return function() {
let m = 1
return function test2(){
console.log(++m)
}
}
}
let b = test1()()
b() //2
b() //3
- 实际上上述例子中变量n也被保存了,因此可以说闭包延伸了函数的生命周期