apply、call、bind 区别
- apply、call、bind都是函数原型对象上面的属性,即Function.prototype.apply();
- apply与call区别:
- 相同点:都是调用一个对象的一个方法,用另一个对象替换当前对象(功能相同)
- 不同点:call()的第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型,当第一个参数为null、undefined的时候,默认指向window;
- apply():第一个参数是this要指向的对象,第二个参数是数组
- call()和bind()的区别:
- 相同点:都是用来改变this的指向
- 不同点:call()改过this的指向后,会再执行函数,bind()改过this后,不执行函数,会返回一个绑定新this的函数
apply、call、bind 实现
Function.prototype.newApply = function (context, parameter) {
if (typeof context === 'object') {
context = context || window
} else {
context = Object.create(null);
}
let fn = Symbol(); // 保证对象属性的唯一性;
context[fn] = this; // 通过this获取call的函数(this指向调用者对象)
console.log(context);
context[fn](...parameter);
delete context[fn]; // 目的是保证使用完之后删除对应的属性;
}
let person = {
name: 'Abiel'
}
function sayHi(age, sex) {
console.log(this.name, age, sex);
}
sayHi.newApply(person, [25, '男']);
参考链接: