0
点赞
收藏
分享

微信扫一扫

call()与apply()的作用与区别


1. 概念

  • 每个函数都包含两个非继承而来的方法:apply()和call()。
  • call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;

2. 作用

  • call()方法和apply()方法的作用相同:改变this指向。

3. 区别

  • 他们的区别在于接收参数的方式不同:
  • call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。
  • apply():传递给函数的是参数数组

4. 应用

var name = "Evan";
  var age = 20;

  var person = {
    name: "Hillary",
    age: 19,
    sayIntroduce: function () {
      return (
        "Hello, My name is " + this.name +" and I'm " +this.age +" years old."
      );
    },

    sayHobby: function (val1, val2) {
          return "I'm " + this.name + ", I like " + val1 + " and " + val2 + ".";
    },
  };

  
  var person1 = {
    name: "Coy",
  };

  
  console.log(person.sayIntroduce()); 
  // Hello, My name is Hillary and I'm 19 years old.
  
  // 当我们通过 call 和 apply 来this的指向时,不传任何参数,则默认为将this指向修改为 windows
  
  console.log(person.sayIntroduce.call()); 
  // Hello, My name is Evan and I'm 20 years old.
  console.log(person.sayIntroduce.apply()); 
  // Hello, My name is Evan and I'm 20 years old.
  
  // 有参数时,this 指向第一个参数:将this指向 person1,
  由于person1中没有age属性,因此为 undefined
  console.log(person.sayIntroduce.call(person1)); 
  // Hello, My name is Coy and I'm undefined years old.
  
  console.log(person.sayIntroduce.apply(person1)); 
  // Hello, My name is Coy and I'm undefined years old.
  
  // 当需要传递参数时,call可以直接写多个参数,apply需要用数组方式传递:
  console.log(person.sayHobby.call(person1, 'swimming', 'hiking')); 
  // I'm Coy, I like swimming and hiking. 

  console.log(person.sayHobby.apply(person1, ['swimming', 'hiking'])); 
  // I'm Coy, I like swimming and hiking.


举报

相关推荐

0 条评论