obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
call和apply做用都是把obj綁定到thisObj的做用,即改變this的指向,然而惟一的區別就是apply傳遞的參數必須得是數組的形式傳遞,而call則直接連續參數傳遞數組
當一個對象須要調用另一個對象裏面的方法的時候就能夠用到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