美文网首页
call、apply、bind其实很简单

call、apply、bind其实很简单

作者: 郁南 | 来源:发表于2020-09-29 17:56 被阅读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 一样

    相关文章

      网友评论

          本文标题:call、apply、bind其实很简单

          本文链接:https://www.haomeiwen.com/subject/xngeuktx.html