搜尋部落格文章

2012年2月9日 星期四

Function 的 call & apply

Function類的重要方法call()與apply()
我們知道,每個function最終在執行時,都要有一個上下文環境,也就是this指針在函數執行時,到底指向誰的問題?
var  jimmy: Object  = new  Object ();
//定義jimmy對象的一個方法
jimmy.addSalary = function (addSalary: uint ): void {
    trace ( "姓名:" , this .name, ",原工資:" , this .salary, ",新工資:" , this .salary + addSalary);
};
這裡我們動態的給jimmy對象定義了一個addSalary方法,注意addSalary方法體中的this,如果我們用
jimmy.name = "jimmy.yang" ;
jimmy.salary = 3000 ;
jimmy.addSalary( 500 ); //姓名: jimmy.yang ,原工資: 3000 ,新工資: 3500
這樣調用時,this指針默認就是指向jimmy的,所以this.name自然就是jimmy.yang,而this.salary自然也就是3000,這不廢話麼?
但是我們可以藉助Function類的apply以及call方法,顯式改變this指針的指向!注意上面代碼中的這一部分:
var  mike: Object  = new  Object ();
mike.name = "Mike" ;
mike.salary = 5000 ;
jimmy.addSalary.call(jimmy, 1000 ); //姓名: jimmy.yang ,原工資: 3000 ,新工資: 4000
jimmy.addSalary.call(mike, 1000 ); //姓名: Mike ,原工資: 5000 ,新工資: 6000    
這裡我們又搞出了一個mike對象,而且並沒有給他定義addSalary方法,但如果系統也要給mike同志臨時加工資怎麼辦?可以把jimmy對象的addSalary方法應用在mike身上,即jimmy.addSalary. call ( mike ,1000),最終mike得償所願,在原工資5000的基礎上加了1000,就成了工資6000 (如果現實中加工資也這麼容易就好了)
至於apply方法,作用跟call一樣,也可以用來改變函數執行時,this指針的指向,區別在於apply方法要求第二個參數必須是數組形式,即:
jimmy.addSalary.apply(mike, [ 1100 ] );