/*
bind函数的作用
1. 改变this的指向
2. 返回bind函数需要被改变this指向的函数(this为bind方法的第一个参数)
3. 传入剩余参数
*/
let obj = {
name: 'wl'
}
function sayName(a, b) {
console.log(this.name);
console.log(a);
console.log(b);
}
Function.prototype.myBind = function () {
let args = Array.from(arguments)//获取参数合集,arguments是类数组,需要转换为数组
let context = args.shift()//获取第一个参数this
let self = this//拿到调用时的函数此时为this
return function(){//返回新的函数调用
return self.apply(context,args)
}
}
let fn = sayName.bind(obj, 1, 2)
let fn2 = sayName.myBind(obj, 1, 2)
fn()
fn2()
let obj = {
name: 'wl'
}
function sayName(a, b) {
console.log(this.name);
console.log(a);
console.log(b);
}
/*
call函数的作用
1. 改变this的指向
2. 传入剩余参数
3. 返回调用后改变this指向的函数调用结果
*/
Function.prototype.myCall = function () {
let args = Array.from(arguments)//获取参数合集,arguments是类数组,需要转换为数组
let context = args.shift()//获取第一个参数this
context.self = this// 在this中绑定需要调用函数的方法,利用this的特性,点语法的this指向为点语法前那一位
let result = context.self(...args)//在this中调用需要修改this指向的函数,并传入剩余参数
delete context.self//删除多余调用函数
return result//返回调用结果
}
sayName.call({name:'xc1'}, 1, 2)
sayName.myCall({name:'xc1'}, 1, 2)