call() 和 apply()

  • 这两个方法都是函数对象的方法,需要通过函数对象来调用
  • 当对函数调用 call() 和 apply() 都会调用函数执行
  • 在调用 call() 和 apply() 可以将一个对象指定为第一个参数

    • 此时这个对象将会称为函数执行时的 this
      1. function fun(){
      2. console.log(this.name);
      3. }
      4. var obj = {name:"你好"};
      5. var obj2 = {name:"世界"};
      6. // fun();
      7. fun.call(obj); // 你好
      8. fun.apply(obj2); // 世界

      call()

  • 可以将实参在对象之后依次传递

    function fun(a,b){
    //   console.log(this.name);
    console.log(a);
    console.log(b);
    }
    var obj = {name:"你好"};
    var obj2 = {name:"世界"};
    // fun();
    fun.call(obj,1,2);  // 1 2
    

    apply()

  • 需要将实参封装到一个数组中统一传递

    function fun(a,b){
    //   console.log(this.name);
    console.log(a);
    console.log(b);
    }
    var obj = {name:"你好"};
    var obj2 = {name:"世界"};
    // fun();
    // fun.call(obj,1,2);
    fun.apply(obj,[1,2]);  // 1 2
    

    this的情况:

  1. 以构造函数形式调用时,this永远都是 window
  2. 以方法的形式调用时,this使调用方法的对象
  3. 以构造函数的形式调用时,this是新建创建的那个对象
  4. 使用 call 和 apply 调用时,this是指定的那个对象