美文网首页
关于Javascript中apply、call、bind

关于Javascript中apply、call、bind

作者: 蓝醇 | 来源:发表于2019-03-06 15:40 被阅读0次

    示例1:

    this.x = 9; 
    var module = {
      x: 81,
      getX: function() { return this.x; }
    };
    
    module.getX(); // 返回 81
    
    var retrieveX = module.getX;
    retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域
    
    // 创建一个新函数,将"this"绑定到module对象
    // 新手可能会被全局的x变量和module里的属性x所迷惑
    var boundGetX = retrieveX.bind(module);
    boundGetX(); // 返回 81
    

    示例2:

    function LateBloomer() {
      this.petalCount = Math.ceil(Math.random() * 12) + 1;
    }
    
    // Declare bloom after a delay of 1 second
    LateBloomer.prototype.bloom = function() {
      window.setTimeout(this.declare.bind(this), 1000);
    };
    
    LateBloomer.prototype.declare = function() {
      console.log('I am a beautiful flower with ' +
        this.petalCount + ' petals!');
    };
    
    var flower = new LateBloomer();
    flower.bloom();  // 一秒钟后, 调用'declare'方法
    

    小结

    • call 和 apply 特性一样
      • 都是用来调用函数,而且是立即调用
      • 但是可以在调用函数的同时,通过第一个参数指定函数内部 this 的指向
      • call 调用的时候,参数必须以参数列表的形式进行传递,也就是以逗号分隔的方式依次传递即可
      • apply 调用的时候,参数必须是一个数组,然后在执行的时候,会将数组内部的元素一个一个拿出来,与形参一一对应进行传递
      • 如果第一个参数指定了 null 或者 undefined 则内部 this 指向 window
    • bind (ES5中新增了bind()函数来改变this的指向。)
      Function.prototype.bind(obj)作用:将函数内的this绑定为obj, 并将函数返回。

    call()、apply()和bind()的区别:

    • 都能改变this的指向
    • call()/apply()是立即调用函数
    • bind():绑定完this后,不会立即调用当前函数,而是将函数返回,因此后面还需要再加()才能调用。
      bind()传参的方式和call()一样。
      分析:为什么ES5中要加入bind()方法来改变this的指向呢?因为bind()不会立即调用当前函数。bind()通常使用在回调函数中,因为回调函数并不会立即调用。如果你希望在回调函数中改变this,不妨使用bind()。
      • 可以用来指定内部 this 的指向,然后生成一个改变了 this 指向的新的函数
      • 它和 call、apply 最大的区别是:bind 不会调用
      • bind 支持传递参数,它的传参方式比较特殊,一共有两个位置可以传递
          1. 在 bind 的同时,以参数列表的形式进行传递
          1. 在调用的时候,以参数列表的形式进行传递
        • 那到底以谁 bind 的时候传递的参数为准呢还是以调用的时候传递的参数为准
        • 两者合并:bind 的时候传递的参数和调用的时候传递的参数会合并到一起,传递到函数内部

    相关文章

      网友评论

          本文标题:关于Javascript中apply、call、bind

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