2011/08/18

javascript的Function.apply()與Function.call()

有時候寫網頁時,DOM 元素的事件處理函式,裡面都是用 this 來存取觸發事件的元素;若想直接呼叫這些處理函式,則 this 會變成指向 window 物件。在沒有辦法指定 this 的情況下要如何直接呼叫這些函式呢?老師有沒有蕉你要多翻API...還愣著做什麼!

原生的 Function 物件提供了兩個函式 apply 與 call,可以在呼叫函式時改變函式內 this 指向的物件
Function.apply(obj, [argument1, argument2, ..., argumentN]);
Function.call(obj, argument1, argument2, ..., argumentN);

而這兩個函式的差異只在參數的傳遞方式而已,第一個參數皆為 this 的指標,而呼叫函式時的參數,apply 用陣列把參數包起來,call 則是依序列出參數
function alertColor(name) {
 //若直接呼叫此函式,this 會指向底層的 window 物件
 alert(name + '\'s color is ' + this.color + '!');
} 

function Fruit(color) {
 this.color = color; 
}

var banana = new Fruit('yellow');
var apple = new Fruit('red');
alertColor.apply(banana, ['Banana']);
alertColor.call(apple, 'Apple');

據說這在實作物件階層時特別有用(呼叫父類別的函式?),有機會研究在補上。

沒有留言:

張貼留言