call和apply的區別和用法

call和apply的區別

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
call和apply做用都是把obj綁定到thisObj的做用,即改變this的指向,然而惟一的區別就是apply傳遞的參數必須得是數組的形式傳遞,而call則直接連續參數傳遞數組

call和apply在什麼地方能夠用到呢?

當一個對象須要調用另一個對象裏面的方法的時候就能夠用到call和apply,call和Apply能夠理解成是繼承另一個對象的方法,如下代碼舉例:app

首先,咱們先創建兩個對象,obj1和obj2this

var name = "全局中的name";
    var obj1 = {
        name:"obj1中的name",
        func1:function(){
            console.log(this.name);
        },
        func2:function (a,b) {
            console.log(a+b);
            return a+b;
        }
    }

    var obj2 = {
        name:"obj2中的name"
    }

若是obj2對象要調用obj1中的func1方法,則code

obj1.func1.call(obj2); //輸出:obj2中的name
 obj1.func1.apply(obj2);//輸出:obj2中的name

call和apply第一個參數都是表示obj1綁定的對象,若是obj1要綁定到this,此時obj1就是綁定到全局,如:對象

obj1.func1.call(this);//輸出:全局中的name
 obj1.func1.apply(this);//輸出:全局中的name

若是obj2對象要調用obj1中的func2方法,則繼承

obj1.func2.call(obj2,1,2);//輸出:3
  obj1.func2.apply(obj2,[1,2]);//輸出:3

此時func2方法是有參數的,call和apply中第二個參數開始是傳給func2方法的參數,可是call參數是直接連續傳遞,而apply傳遞參數是以一個數組傳遞io

所有代碼展現:console

var name = "全局中的name";
    var obj1 = {
        name:"obj1中的name",
        func1:function(){
            console.log(this.name);
        },
        func2:function (a,b) {
            console.log(a+b);
            return a+b;
        }
    }

    var obj2 = {
        name:"obj2中的name"
    }

    obj1.func1.call(this);//輸出:全局中的name
    obj1.func1.apply(this);//輸出:全局中的name

    obj1.func1.call(obj2); //輸出:obj2中的name
    obj1.func1.apply(obj2);//輸出:obj2中的name

    obj1.func2.call(obj2,1,2);//輸出:3
    obj1.func2.apply(obj2,[1,2]);//輸出:3
相關文章
相關標籤/搜索