apply和call的使用和区别

时间:2021-08-11 05:03:51

apply :

Function.apply(obj, args)接收两个参数:

obj: 改变Function的this指向,使其指向obj;

args: 传入给函数的数组参数;

call:

Function.call(obj, param1, param2, param3...)

obj: 改变Function的this指向,使其指向obj;

args: 传入给函数的数组参数;

实例:

function add(c, d) {
    return this.a   this.b   c   d;
}
var strObj = { a: ‘今天‘, b: ‘天气‘};
console.log(add.apply(strObj, [‘真‘, ‘好‘])); // 今天天气真好
console.log(add.call(strObj, ‘真‘, ‘好‘));    // 今天天气真好

 

apply和call的区别:

  • 参数的传入形式不同:

    apply的只有两个参数,第一个参数是this指向的对象,第二个参数是传入Funtion的参数组成的数组;

    call有一个及以上的参数, 第一个参数是this指向的对象,后面的参数均是传入Function的参数,有两个就是传给Function两个参数,有三个就是传了三个,有几个传几个;

  • 使用场景不同:

    若参数的形式是数组类型,且在调用时,参数的顺序一致(不出现乱换参数位置的情况),比如:父函数是Person(name, age) 子函数Student(name, age, grade),就可以使用apply;

    若参数顺序不一致,比如:父函数 Person(name, age)子函数 Student(age, name, grade),就可以使用call,指定参数对应值的位置(Student.call(this, name, age, grade));

apply和call可用于继承

 

function Class10(){
  this.showSub = function(a,b){
        alert(a - b);
    }   
}
 
function Class11(){
  this.showAdd = function(a,b){
        alert(a   b);
    }  
}
 
function Class12(){
  Class10.apply(this);
  Class11.apply(this);   
  // Class10.call(this);
  //Class11.call(this);  
}
 
var c2 = new Class12();
c2.showSub(3,1);    //2
c2.showAdd(3,1);    //4