概念&原理
函数柯里化:
其原理就是利用闭包来对函数的参数进行缓存,以此来达到当函数有多个参数的时候,可以先传递一部分参数,然后返回一个新函数,新函数再去接收剩余的所有参数并返回结果。
闭包:
在第三版javaScript高级程序设计一书中,对闭包的解释是指有权访问另一个函数作用域中的变量的函数。
案例
模拟实现lodash的curry函数
const curry = (fn) => { // fn 是将要变成柯里化的函数
// 此处返回一个已经被柯里化的函数,可以利用闭包缓存参数函数fn
const curriedFn = (...args) => {
// 在柯里化函数里面,将柯里化函数被调用时传进来的参数args与原函数fn的参数数量进行比较
if (args.length < fn.length){ // 说明没有传入fn所需的全部参数
// 再次利用闭包去缓存第一次调用柯里化函数时传入的参数args
return (...args1) => { // 第一次参数没有传完的话,会返回该函数。args1是fn所需的剩余参数
// 将第一次传入的参数args与最后一次调用传入的args1,合并组合成fn所需的全部参数
return curriedFn(...[...args,...args1])
}
}
return fn(...args)
}
return curriedFn;
}
我所理解的闭包
闭包发生的时机往往是在嵌套函数的时候,内部函数可以访问外部函数的变量。此时就拥有了产生闭包的条件,但并不是意味着它就是闭包。必须还要通过调用外部函数将内部函数返回的方式来去真正的创建闭包。
const fn1 = () => {
let sign = false;
// 函数内部返回一个函数,并且内部函数引用到了外部函数的sign变量,此时就拥有了产生闭包的条件
return (...args) => {
if(!sign){
sign = true;
console.log("测试")
setTimeout(()=>{
sign = false;
},3000)
}
}
}
const ceshi = fn1(); //调用外部函数去真正的创建一个闭包
ceshi()
ceshi()
ceshi()
ceshi()
ceshi()
ceshi = null // 消除闭包的影响
// 消除闭包的原理
// 当不需要使用闭包的时候可以手动的将ceshi设置为null来消除闭包造成的内存占有
// 原理是变量ceshi存储着对内部函数的引用,内部函数又使用了外部函数的sign,可以理解成sign一直被ceshi引用着,将ceshi置为null,说明就没有引用sign了。此时它就会被回收,释放其占用的内存空间。