如何理解以下这段反柯里化代码:
Function.prototype.unCurrying = function () {
'use strict'
const self = this
return function () {
return Function.prototype.call.apply(self, arguments)
}
}
// 使用说明
const push = Array.prototype.push.unCurrying()
const arr = [1,2,3]
push(arr,4)
console.log(arr) // [1,2,3,4]
一句话解释就是:
在self被调用的对象上新建一个call隐式绑定函数并传入参数(self和arguments)这等效于(p1, …p2) 所以 arguments 会自动分解为p1p2两部分;
要理解这个就必须要理解手写call和apply
Function.prototype.myCall = function (fn, ...args) {
const key = Symbol()
fn[key] = this
const result = fn[key](...args)
delete fn[key]
return result
}
Function.prototype.myApply = function (fn, args) {
const key = Symbol()
fn[key] = this
const result = fn[key](...args)
delete fn[key]
return result
}
所以文章开头代码实际上就是
return Function.prototype.myCall.myApply(self, arguments) //参数(self和arguments)这等效于(p1, ...p2) 所以 arguments 会自动分解为p1p2两部分;
这就是反柯里化的原理.