call、apply、bind实现
1.语法
func.call(_this,arg1,arg2)
func.apply(_this,[arg1,arg2])
func.bind(_this,arg1,arg2)()
2.call、apply、bind实现
实现原理:
都是Function.prototype上的方法
第一个参数没传,指向global或window
foo.func() 隐式调用this指向问题
function print(b,c){
console.log(this.a,b,c)
}
// call实现
Function.prototype.myCall = function (){
let [thisArr,...args] = [...arguments]
if(!thisArr) thisArr = typeof window === 'undefined' ? global : window
thisArr.func = this
const result = thisArr.func(...args)
delete thisArr.func
return result
}
print.myCall({a:888},999,1000)
// apply实现
Function.prototype.myApply = function (thisArr,rest){
if(!thisArr) thisArr = typeof window === 'undefined' ? global : window
thisArr.func = this
let result;
if(rest){
result = thisArr.func(...rest)
}else{
result = thisArr.func()
}
delete thisArr.func
return result
}
print.myApply({a:888},[999,1000])
function doSomething(b){
console.log(this.a+b)
}
// 实现bind
Function.prototype.myBind = function (){
let [thisArr,...args] = [...arguments]
if(!thisArr) thisArr = typeof window === 'undefined' ? global : window
const func = this
return function (){
func.apply(thisArr,[...args,...arguments])
}
}
const result = doSomething.myBind({a:2},3)()

浙公网安备 33010602011771号