call、apply和bind
call()、apply()和bind()方法 三者作用都是 改变this指向。
1、call、apply & bind 使用
var year = 2021
function getDate(month, day) {
return this.year + '-' + month + '-' + day
}
let obj = {
year: 2022
}
getDate.call(null, 3, 8) //2021-3-8
getDate.call(obj, 3, 8) //2022-3-8
getDate.apply(obj, [6, 8]) //2022-6-8
getDate.bind(obj)(3, 8) //2022-3-8
2、call 方法实现原理
Function.prototype.myCall = function (context) {
/*
this -- getDate
context -- obj
arguments -- [obj, 3, 8]
*/
// 判断调用对象
if (typeof this !== "function") {
console.error("type error");
}
// 获取参数
let args = [...arguments].slice(1),
result = null;
// 判断 context 是否传入,如果未传入则设置为 window
context = context || window;
// 将调用函数设为对象的方法
context.fn = this;
// 调用函数
result = context.fn(...args);
// 将属性删除
delete context.fn;
return result;
};
function getDate(month, day) {
return this.year + '-' + month + '-' + day
}
let obj = {
year: 2022
}
getDate.myCall(obj, 3, 8) //2022-3-8