闭包
要理解闭包,首要知道什么是自由变量。
自由变量就是,在函数中使用的变量。但它既不是函数的参数,也不是函数的局部变量。闭包笼统的说:就是能访问到自由变量的函数。
在js中,闭包存在的意义就是让我们可以间接访问函数内部的变量
柯里化
柯里化,就是把接受多个参数的函数变换成一个接受单一参数(或部分)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
编写一个add函数,使其add(1,2)或add(1)(2)的结果都是3
//单独实现第一种
function add(a, b) {
return a + b
}
//单独实现第二种
function add(a) {
return function (b) {
return a + b
}// 其实这里就是一个闭包,内部函数调用了自由变量b
}
//两种皆可以实现
function add(a, b) {
return arguments.length > 1 ? (b) => a + b : a + b
}
一个完美的柯里化函数
function add () {
let args = [...arguments];//把arguments类数组模式参数转换成数组
let fun = function () {
let newArgs = args.concat([...arguments]);//利用闭包,合并arguments参数
return add.apply(null, newArgs)
}
//求和a + b
fun.toString = function() {
return args.reduce((a, b) => a + b)
}
return fun
}
柯里化常见的作用:
- 参数复用,对部分参数的复用,无需重复添加。
- 提前返回,提前返回可以返回的返回值并可以继续进行参数的接受。
- 延迟计算,累计传入的参数,最终返回计算结果