call 与 apply 的相同点
都是为了改变函数调用时this指向,函数可立即执行
call 与 apply 的不同点
call使用多个参数进行传参,apply只有两个参数,后面参数是一个数组
一、call 使用说明
let obj = {
gender: '男'
}
function show(name,age) {
return `我是${name} 今年${age}岁了,是一个${this.gender}生`
}
show.call(obj,'zs',20); //我是zs 今年20岁了,是一个男生
call 原理分析
Function.prototype.newCall = function (obj) {
obj = obj || window; //obj要挂载对象
obj.fn = this; //this指调用newCall的实例函数
args = [...arguments].slice(1); //截取第一位以后参数
const result = obj.fn(...args); //平铺数组内容
delete obj.fn; //删除fn属性
return result;
}
show.newCall(obj,'ls',30); //我是ls 今年30岁了,是一个男生
二、apply 使用说明
let obj = {
gender: '男'
}
function show(name,age) {
return `我是${name} 今年${age}岁了,是一个${this.gender}生`
}
show.apply(obj,['zs',20]); //我是zs 今年20岁了,是一个男生
apply 原理分析
Function.prototype.newApply = function (obj) {
obj = obj || window; //obj要挂载对象
obj.fn = this; //this指调用newCall的实例函数
let result;
if (arguments[1]) {
result = obj.fn(...arguments[1]);
} else {
result = obj.fn();
}
delete obj.fn; //删除fn属性
return result;
}
show.newApply(obj,['ls',30]); //我是ls 今年30岁了,是一个男生