淺析call和apply

概述:

今天咱們講一個在我們工做中不常常用,可是卻在面試中常常被問到的方法:call方法和apply方法。

call方法:

call方法:調用一個對象的一個方法,以另外一個對象替換當前對象。
調用方法:call([thisObj,obj1,obj2....])
看下面的例子:
1
2
3
4
5
6
7
8
9
10
function add(a,b)
{
     alert(a+b);
}
function sub(a,b)
{
     alert(a-b);
}
 
add.call(sub,3,1); //4
結果是「4」,call 方法能夠用來代替另外一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。 說的在直白點,上面例子中,把add放到了sub中執行,因此a+b = 4。 若是沒有提供 thisObj 參數,那麼 Global 對象被用做 thisObj。

apply方法:

apply方法的意思和call差很少,惟一的區別就是傳遞的參數是個數組。
調用方法:call([thisObj,[argArray]])
看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function test1(name,age)
     {
         this .name=name;
         this .age=age;
     }
/*定義一個學生類*/
function test2(name,age,grade)
     {
         test1.apply( this ,arguments);
         this .grade=grade;
     }
//建立一個學生類
var test3= new test2( "uw3c" ,24, "一年級" );
//測試
alert( "name:" +test3.name+ "\n" + "age:" +test3.age+ "\n" + "grade:" +test3.grade);
你們確定會驚奇的發現,
this:在建立對象在這個時候表明的是student
arguments:是一個數組,也就是["uw3c","24",」一年級」];
也就是通俗一點講就是:用test3去執行test1這個類裏面的內容,在test1這個類裏面存在this.name等之類的語句,這樣就將屬性建立到了test3對象裏面
 

何時用call方法、apply方法:

在給對象參數的狀況下,若是參數的形式是數組的時候,好比apply示例裏面傳遞了參數arguments, 這個參數是數組類型,而且在調用test1的時候參數的列表是對應一致的(也就是test1和test2的參數列表前兩位是一致的) 就能夠採用 apply , 若是個人test1的參數列表是這樣的(age,name),而test2的參數列表是(name,age,grade),這樣就能夠用call來實現了,也就是直接指定參數列表對應值的位置。
相關文章
相關標籤/搜索