今天偶然看到了一篇博客是关于 call、apply和bind 的,我个人感觉写得有点复杂了,

当然,我的博客一向都是以简单通俗易懂来写的。所以我决定写一篇关于call()、apply()、bind() 的博客,让大家快速的了解它们。

 

在开始之前先说一下它们的作用:call()、apply()、bind() 都是用来重定义 this 对象的,bind 返回的是一个新函数。

我们先来看一个例子: 

  var name = '归隐情缘';
  var age = 18;
  var obj1 = {
    name : '落花流水',
    ages : this.age,
    myFun1 : function(){
      console.log('==>>', this.name + '的年龄是' + this.age);
    }
  }

  console.log('==>>', obj1.ages);
  obj1.myFun1();

  输出结果:

  

 

 

 接下来我们在看一个例子:

  var names = 'hermit';
  function myFun2(){
    console.log('==>>', this.names);
  }

  myFun2();

  输出结果:

  

 

   通过上面的两个例子来做对比,this的指向就很明显了,在第一个例子中 this 指向的是 obj1 对象,而在 obj1 对象中没有 age 变量,所以返回的是 undefined ;

  第二个例子 this 指向的是 window,即全局,而在例二中 names 是全局变量,所以直接返回 变量 names 的值。 

  

在开始的时候就说了,call()、apply()、bind() 都是用来重定义 this 对象的,下面我们再来看一些例子: 

  var name1 = "孔明";
  var ages1 = 9999;
  var obj2 = {
    name1 : '曹操',
    ages2 : this.ages1,
    myFun2 : function(){
      console.log('==>>', this.name1 + '的年龄是' + this.ages1);
    }
  }

  var her = {
    name1 : '马超',
    ages1 : 888
  }


  console.log('==>>', obj2.ages2);
  obj2.myFun2();

  输出结果:

   

 

 

   下面我们通过call()、apply()、bind() 来改变一下 this 指向

  obj2.myFun2.call(her); 

  obj2.myFun2.apply(her);

  console.log(obj2.myFun2.bind(her));
  obj2.myFun2.bind(her)();

   输出结果:

  

 

 

   可以看出,bind 返回的是一个函数,所以我们要在后面加上 () 来调用它。

  接下来我们来看一下 传递参数,

  将上面的例子稍微修改一下

  var name1 = "孔明";
  var ages1 = 9999;
  var obj2 = {
    name1 : '曹操',
    ages2 : this.ages1,
    myFun2 : function(val1, val2){
      console.log(this.name1 + '年龄' + this.ages1 + '来自' + val1 + "去往" + val2);
    }
  }

  var her = {
    name1 : '马超',
    ages1 : 888
  }

  obj2.myFun2.call(her, '广州', '深圳');
  obj2.myFun2.apply(her, ['广州', '深圳']);
  obj2.myFun2.bind(her, '广州', '深圳')();
  obj2.myFun2.bind(her, ['广州', '深圳'])();

  返回的结果:

  

 

 

 

   通过上面可以看出 call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象
  第二个参数的差别: call 的参数是直接传递的,apply 的参数必须是在数组里面的,bind 除了返回的是函数之外,其它的和 call 是一样的,但是如果参数放在数组里面,这个数组会被当成一个参数的数据

   所以最后的 obj2.myFun2.bind(her, ['广州', '深圳'])(); 这里就相当于 只传递了val1,而val2 没有参数,所以返回来自 “ 广州,深圳 ”  去往  undefined。

  相信到这里,你已经知道它们怎么用了吧。那教程就到这里了。

  

 

posted on 2020-07-17 16:34  归隐情缘  阅读(343)  评论(1编辑  收藏  举报