1. 概念
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数。简单讲:就是利用函数执行,可以形成一个不销毁的私有作用域,把预先处理的内容都存在这个不销毁的作用域里面,并且返回一个函数,以后要执行的就是这个函数。
面试过程中很多朋友应该都碰到过下面这个栗子:
// 常规的add函数
function add(x, y) {
return x + y
}
// Currying后
function curryingAdd(x) {
return function (y) {//形成闭包x变量不会被销毁
return x + y
}
}
add(1, 2) // 3
curryingAdd(1)(2) // 3
如果我们无限add(1, 2)(3)(4,5,6)…、 add(1)(2)(3)(4)(5)(6)…
function add(...args) {
let sum = [...args]
function inner(...args1) {
sum.push(...args1)
return inner
}
inner.toString = function () { // 重写toSting() 方法改写函数的默认返回值
return sum.reduce(function(pre,cur){
return pre+cur
},0)
}
return inner
}
add(1, 2)(3)(4,5,6)//21
add(1)(2)(3)(4)(5)(6)//21
2.toString的作用
return fn; fn是一个函数类型的变量,因为fn后面没有括号,所以得到的是函数体源码(如下图)。想要得到函数体的源码,就会调用toString方法。因此我们可以重新toString得到我们想要的
let a={}
let b={name:'zhangsan',age:66}
let c={}
c[a]='one'
c[b]="two"
console.log(c[a])//two
为什么会是‘two’
因为object中的key为一个对象的时候,会调用toString进行转换成"[object Object]"
因此会被第二个覆盖