天天看點

JavaScript中的apply,call與this的糾纏

1.apply定義

apply:調用函數,并用指定對象替換函數的 this 值,同時用指定數組替換函數的參數。

文法:apply([thisobj[,argarray]])

thisobj

可選。要用作 this 對象的對象。

argarray

可選。要傳遞到函數的一組參數。

2.call定義

call:調用一個對象的方法,用另一個對象替換目前對象。

文法:call([thisobj[, arg1[, arg2[, [, argn]]]]])

可選。将作為目前對象使用的對象。

arg1, arg2, , argn

可選。将被傳遞到該方法的參數清單。

3.二者差別

call 的第二個參數可以是任意類型,而apply的第二個參數必須是數組,也可以是arguments。

定義也是有差别的。

4.執行個體分析

    (1)官方執行個體:

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

    (2)執行個體:

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

分析:根據定義:調用函數,并用指定對象替換函數的 this 值,

這裡調用函數zqz,并用指定的對象zqz_1替換zqz函數的this值。

要注意js中的函數名其實是對象,因為函數名是對funtion對象的引用!

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

分析:根據定義:調用一個對象的方法,用另一個對象替換目前對象。

這裡就是調用對象add的方法,并用add對象替換目前對象sub;

再來一個例子:

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

這裡調用函數zqz,使用指定的對象this替換函數zqz的this。

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

分析:定義:調用一個對象的方法,用另一個對象替換目前對象。

調用fun1對象的方法,用window對象替換目前fun1中的對象。

調用fun1對象的方法,用input中對象替換目前fun1中的對象。

調用fun1對象的方法,用新new出來的obj中的對象替換目前fun1中的對象。

5.繼承

例一:

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

結果:b

          b

問題:

為什麼是b?

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

我們可以看到調用的時候,this的指向

為什麼兩個都是b?

classb.call(this) 将 classa.call(this)的屬性與方法覆寫。最後隻有classb的屬性與方法。

例二:這個看上去更像java裡面的繼承感覺

JavaScript中的apply,call與this的糾纏
JavaScript中的apply,call與this的糾纏

結果:zqz

        function classbextendclassa(){

    classa.call(this);

this.job = 'coder';

 }

       coder

轉載:http://www.cnblogs.com/zqzjs/p/5017918.html

繼續閱讀