apply 能改变函数this,它的内部原理
Function.prototype.myApply = function(context){
if(typeof this != 'function'){
// 判断是否为函数
console.log('not a function')
}
context.fn = this // 保存this,context 为window
const result = context.fn(arguments[1]) // 调用函数
delete context.fn
return result
}
和它类似的 bind 原理
Function.prototype.myBind = function(context){
if(typeof this != 'function'){
throw new TypeError('not a function')
}
const _this = this // 保存this
const args = Array.prototype.slice.call(arguments,1)
return function F(){
if(this instanceof F){
// 判断是不是new出来的如果是
// 返回一个空对象,且使创建出来的实例的__proto__ 指向
//_this的prototype,且完成函数柯里化
return new _this(...args,...arguments)
}
else{
// 如果不是new出来的改变this指向,且完成函数柯里化
return _this.apply(context,args.concat(...arguments))
}
}
}