当一个函数返回的是复杂数据类型,并且在函数外有变量函数的返回值,这个时候就会形成一个不会被销毁的函数执行空间,这个时候内部返回的函数就是闭包函数。
优点:
延长变量的生命周期
全局变量可以访问到局部变量
缺点:
因为会有不会销毁的函数执行空间,可能会造成内存溢出(内存消耗)
**直接返回一个函数**
//外层函数
function outer() {
let num = 100
// 内层函数
function inner() {
return num
}
// 需要返回一个复杂数据类型
return inner
}
调用函数
let res = outer()
// res 现在就是函数
// 既然是函数就可以调用
console.log(res);
let result = res()
console.log(result);
**间接返回一个函数**
function outer() {
var num = 200
// 内层函数
var obj = {
// 对象中的值可以是函数
setNum: (val) => {
num = val
},
getNum: function() {
return num
},
}
// 需要返回一个复杂数据类型
return obj
}
闭包函数的应用
沙箱模式、沙箱模式的语法糖、柯里化函数。
**柯里化函数的封装**
柯里化函数是内外层函数,一般外层函数用来传参,内层函数用来实现功能。
function fn(a,b,c,d){
return a+b+c+d
}
//开始封装
function currying(fun,...arg){
//fun是功能函数,是当参数的数量满足fun里面函数数量的要求之后,开始执行
//arg是传进来的参数
let _arg = arg || []
let len = fun.length
return function(...arg){
_arg = [..._arg,...arg]
if(_arg.length < len){
return currying(fun,..._arg)
}else{
return fun(..._arg)
}
}
}
//将来要使用的时候
let res1 = currying(fn,'http:','tianmao')
console.log(res1);
let res2 = res1('4444:', '/list.html')
console.log(res2);