一、函数的柯理化
形成一个闭包(不被释放的上下文),我们就可以“预先”存储一些东西,而这些东西可以供其下级上下文“后期”调取使用 ->柯理化函数思想「预先存储的思想」
例如:实现一个下面的打印
let res = fn(1, 2)(3);
console.log(res); //=>6
const fn = (...params)=>{
return (...args)=>{
let arr = params.concat(args)
return arr.reduce((result,item)=>result+item)
}
}
最后打印验证:
二、面试题
利用函数柯理化思想实现如下打印:
代码如下:
let add = curring();
let res = add(1)(2)(3);
console.log(+res); //->6
add = curring();
res = add(1, 2, 3)(4);
console.log(+res); //->10
add = curring();
res = add(1)(2)(3)(4)(5);
console.log(+res); //->15
const curring = ()=>{
let params = []
const add=(...args)=>{
params = params.concat(args)
return add
}
add[Symbol.toPrimitive]=function(){
return params.reduce((result,item)=>{
return result + item
})
}
return add
}
之所以能想到这一段是因为
add[Symbol.toPrimitive]=function(){
return params.reduce((result,item)=>{
return result + item
})
}
alert(fn); //先把fn变为字符串,然后再输出 String(fn) : Symbol.toPrimitive->valueOf->toString
console.log(fn); //也是要把fn变为字符串再输出的,控制台会在字符串前面加一个 ƒ,代表这是函数字符串 「新版谷歌浏览器修改了机制:log输出也会执行Symbol.toPrimitive等方法,但是不论方法最后返回啥,还是输出的函数字符串」
其实这道题最原始的题目是: 执行curring函数需要指定执行的次数的
let add = curring(3);
let res = add(1)(2)(3);
console.log(res); //->6
add = curring(2);
res = add(1, 2, 3)(4);
console.log(res); //->10
add = curring(5);
res = add(1)(2)(3)(4)(5);
console.log(res); //->15
const curring = (count)=>{
let params = [] ,
n = 0
const add=(...args)=>{
params = params.concat(args)
n++
if(n>=count) return params.reduce((result,item)=>{
return result + item
})
return add
}
return add
}