函数的柯理化思想


一、函数的柯理化

形成一个闭包(不被释放的上下文),我们就可以“预先”存储一些东西,而这些东西可以供其下级上下文“后期”调取使用 ->柯理化函数思想「预先存储的思想」

例如:实现一个下面的打印

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值