JS中apply、call、bind区别与实现

77 阅读1分钟

apply、call、bind 区别

  1. apply、call、bind都是函数原型对象上面的属性,即Function.prototype.apply();
  2. apply与call区别:
  • 相同点:都是调用一个对象的一个方法,用另一个对象替换当前对象(功能相同)
  • 不同点:call()的第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型,当第一个参数为null、undefined的时候,默认指向window;
  • apply():第一个参数是this要指向的对象,第二个参数是数组
  1. 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, '男']);

参考链接:

apply、call、bind原生实现

apply、call、bind用法与与区别