浅谈闭包

闭包

在一个函数内新建另一个函数时,就相当于创建了一个闭包。内层函数就是闭包。通常情况下,为了能够使得外部函数的内部变量可以访问,一般都会返回这个闭包。

有权访问另一个函数作用域中的变量的函数

1
2
3
4
5
6
7
8
9
function outerFunction () {
const outer = `fr`

return function innerFunction() {
console.log(outer)
}
}

outerFunction()() //fr

闭包与变量

闭包产生的副作用:闭包只能取得包含函数中任何变量的最后一个值

1
2
3
4
5
6
7
8
9
10
11
function createFunction(){
const result= new Array()
for(var i=0;i<10;i++){
result[i]= function(){
return i
}
}
return result
}

//函数返回的数组元素都是10

因为在每个函数的作用域中都保存着createFunction函数的活动对象,所以他们引用的是同一个变量i。可以通过创建另一个匿名函数强制让闭包的行为符合预期

1
2
3
4
5
6
7
8
9
10
11
function createFunction(){
const result= new Array()
for(var i=0;i<10;i++){
result[i]= function(num){
return function(){
return num
}
}(i)
}
return result `
}

闭包的用途

  1. 访问函数的局部变量
  2. 让变量的值始终保存在内存中,不被清除
  3. 减少副作用:可以创建一个任你驱使的内层闭包。bind()
  4. 创建私有变量

    函数内的变量,在函数外部是不能访问的既然不能访问,那么它们就可以称作私有变量。但是有时候确实是需要访问私有变量的。这时候就需要闭包

应用场景

  1. 匿名自执行函数:减少/避免全局变量的使用
  2. 实现封装,类似于私有变量
  3. 在函数执行之前为要执行的函数提供参数