开发者社区> 问答> 正文

使用 apply、call、bind

使用 apply、call、bind

展开
收起
问答小能手! 2021-02-20 16:05:53 4193 0
1 条回答
写回答
取消 提交回答
  • 来自昆仑山,真名陆离。

    apply、call、bind 都是可以改变 this 的指向的,但是这三个函数稍有不同

    1.fun.call(thisArg[, arg1[, arg2[, ...]]])
    2.fun.apply(thisArg, [argsArray])

    call 与 apply是相似的,只是调用方法不同,apply只能接收两个对象:一个新的this对象和一个参数数组。call 则可以接收一个this对象和多个参数 例子:

    function add(a, b){
      return a + b;  
    }
    function sub(a, b){
      return a - b;  
    }
    
    // apply() 的用法
    var a1 = add.apply(sub, [4, 2]); // sub 调用 add 的方法
    var a2 = sub.apply(add, [4, 2]);
    
    a1; // 6 将sub的指针指向了add,所以最后执行的是add
    a2; // 2
    
    // call() 的用法
    var a1 = add.call(sub, 4, 2);
    
    

    他们与bind 的区别是,这两个方法会立即调用,bind()不会立即调用,需要手动去调用。例子:

    
    window.onload = function() {
      var fn = {
        num: 2,
        fun: function() {
          document.getElementById("box").onclick = (function() {
            console.log(this.num);
          }).bind(this);
          // }).call(this);
          // }).apply(this);
        }
            /*
             * 这里的 this 是 fun,所以可以正确地访问 num,
             * 如果使用 bind(),会在点击之后打印 2;
             * 如果使用 call() 或者 apply(),那么在刷新网页的时候就会打印 2
            */
        }
        fn.fun();
    }
    
    2021-02-20 16:07:31
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载