写一个call🍏
模拟一个call方法查看
Function.prototype.myCall = function (context) {
// 挂在一个fn函数
var context = context || window;
context.fn = this
// 执行该函数
let args = [...arguments].slice(1)
let result = context.fn(...args)
// 删除该函数
delete context.fn
// 返回结果
return result
}
写一个apply🍏
模拟一个apply方法查看
Function.prototype.myApply = function(context){
// 挂载一个函数
var context = context || window
context.fn = this
// 执行该函数
let args = arguments[1]
let result;
args ? result = context.fn(...args) : result = context.fn()
// 删除该函数
delete context.fn
// 返回结果
return result
}
写一个bind🍏
柯里化🍏
柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。
如果要实现下面这个方法:add(1, 2)(3)(4)(5, 6, 7)(9)()
上面这个函数当参数为空的时候执行了内部参数所有值的相加,所以我们应该考虑当参数不为空的时候将缓存起来,在为空的时候再相加,这样的思路会用闭包的方式来实现。下面是实现方法:
function add(){
// 缓存所有的arguments值
let args = [...arguments]
// 新建fn函数实现柯里化
let fn = function (){
// 如果参数为空,那么递归停止,返回执行结果
if (arguments.length === 0){
return args.reduce((a,b) => a + b)
} else {
// 否则将参数保存到args里面,返回fn方法
args.push(...arguments)
return fn
}
}
return fn
}
add(1, 2)(3)(4)(5, 6, 7)(9)() // 37