闭包
kying-star的博客
# 闭包
js支持闭包,也就是函数可以访问函数外的变量。
例如
var hello = "hello"
function sayhi(){
console.log(hello)
}
sayhi()//hello
注意闭包不是在定义时保存变量,而是实时的访问
例如
var hello = "hello"
function sayhi(){
console.log(hello)
}
hello = "byebye"
sayhi()//byebye
# 函数柯里化
利用闭包的特性,可以将函数柯里化
柯里化指将接受多个参数的函数转为接受单一参数的函数
例如实现三数之和
var plus = (a,b,c)=>a + b + c
var add = (a)=>(b)=>(c)=>a + b + c;//es6写法
console.log(plus(1,2,3));//6
console.log(add(1)(2)(3));//6
也可以通过封装将一个函数柯里化
var plus = (a,b,c)=>a+b+c
//限定参数个数的柯里化的封装
function curry(fn){
let len = fn.length;//获取参数的个数
return function temp(){
let args = [...arguments]; //定义一个数组接收展开的arguments
if(args.length>=len){//收集参数大于等于原函数设定的参数个数时
return fn(...args);//将数组展开。展开符...(将数组展开为数的序列)
//[1,2,3]=>1,2,3
}else{//否则就返回函数,实现柯里化
return function(){
return temp(...args,...arguments)
}
}
}
}
var addsum = curry(plus)//调用柯里化函数,将plus()柯里化
console.log(addsum(3)(2)(1));//6