什么是闭包?
在了解闭包之前,让我们来回顾一下什么是变量作用域?
变量根据作用域的不同分为两种:全局变量(在函数外部)和局部变量(在函数内部)。
- 函数内部可以使用全局变量。
- 函数外部不可以使用局部变量。
- 当函数执行完毕,本作用域内的局部变量会销毁。
闭包的含义
闭包(closure)是指有权访问另一个函数作用域中变量的函数,是JavaScript中,函数的一种高级应用。
简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。
生成闭包的三个必要条件(三个条件缺一不可)
- 在函数A内部直接或者间接返回一个函数B
- B函数内部使用着A函数的私有变量(私有数据)
- A函数外部有一个变量接收着函数B
闭包函数会形成一个不会销毁的函数空间
function a(){
//num变量就是函数a的私有变量
var num=100;
return function(b){
console.log(num)
}
}
//res 接收的是a函数执行以后的返回值
//res接收的就是函数a内部返回的一个复杂数据类型(函数b)
// =>导致函数a的执行空间不会销毁
//res 随时可以是一个函数a里面返回的函数b
// =>res可以随时调用
res()
//当res调用的时候,打印num,打印出来的就是a函数内部的私有变量num的值
- 把这个不会销毁的a函数的执行空间叫做闭包空间
- 把函数a里面返回的函数b,叫做函数a的闭包函数
闭包还可以间接返回一个函数
- 上面的案例代码中是闭包直接返回一个函数b,闭包还可以间接返回一个函数,return一个对象或者数组,在这个对象或者数组中有一个函数。
- 当需要访问一个数据的时候,可以使用直接返回或者间接返回
- 当需要访问多个私有数据的时候,就需要使用间接返回的方式,返回的一个对象里面包含多个闭包函数
function fn(){
var num=100;
var num=200;
return {
getNum:function(){
console.log(num)
},
getNum2:function(){
console.log(num2)
}
}
}
var res=fn()
//res得到的是一个对象
//这个对象里面有一个函数是fn的闭包函数
console.log(res)
res.getNum()
res.getNum2()
闭包的特点
- 延长了变量的生命周期
- 可以访问函数内部的私有变量
- 保护私有变量
关于闭包函数的面试题
下列代码会输出什么
function fn(i){
return function(n){
console.log(n + (--i))
}
}
var f = fn(2)
f(3) //4
fn(4)(5) //8
fn(6)(7) //12
f(8) //8
函数执行过程图解
函数有两个阶段
来源:CSDN
作者:pro_Top
链接:https://blog.csdn.net/weixin_42020084/article/details/104458725