call、apply、bind其实很简单

2020-09-29  本文已影响0人  郁南

使用过程

var name = "小王",
  age = 17,
  from = "广州";
var obj = {
  name: "小张",
  age: 20,
  from: from,
  fn: function (s1, s2) {
    return console.log(
      "姓名:" +
        this.name +
        ",年龄:" +
        this.age +
        ",来自:" +
        s1 +
        ",去往:" +
        s2
    );
  },
};
// 这里是obj直接调用,所以this指向是obj
// obj.fn(); // 姓名:小张,年龄:20,来自:undefined,去往:undefined

var obj2 = {
  name: "小米",
  age: 12,
  from: "深圳",
};
// obj.fn.call(obj2); // 重新指向this为第一个参数的调用
// obj.fn.apply(obj2); // 重新指向this为第一个参数的调用
// obj.fn.bind(obj2)(); // 重新指向this为第一个参数的调用,但是因为返回新函数,所以需要自执行
// 姓名:小米,年龄:12,来自:undefined,去往:undefined

// obj.fn.call(obj2, "广州", "深圳"); // 重新指向this为第一个参数的调用,如有参数,顺序填充进去
// obj.fn.apply(obj2, ["广州", "深圳"]); // 重新指向this为第一个参数的调用,如有参数,数组形式填充进去
obj.fn.bind(obj2, "广州", "深圳")(); // 重新指向this为第一个参数的调用,但是因为返回新函数,所以需要自执行,如有参数,和call一样顺序填充进去
// 姓名:小米,年龄:12,来自:广州,去往:深圳

总结

  1. call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象

  2. call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )

  3. apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])

  4. bind 除了返回是函数以外,它 的参数和 call 一样

上一篇下一篇

猜你喜欢

热点阅读