函數篇之2——匿名函數

1.  匿名函數實例:
>>> function ( a ){ return a; }
     匿名函數也就是說沒有方法名。
2.  匿名函數的主要用法:
2.1 我們可以將匿名函數作爲參數傳遞給其它函數,這樣,接收方函數就能利用我們所傳遞的函數來完成某些事情。
2.2 我們可以定義某個匿名函數來執行某些一次性任務。
3.  接下來,我們來看具體的應用示例,通過其中的細節來進一步瞭解匿名函數。
3.1 回調函數
①.  解釋: 當我們將函數A 傳遞給函數B ,並由B 來執行A 時,A 就成了一個回調函數(callback function)。
  如果這時A 還是一個無名函數,那麼我們就稱它爲匿名回調函數
②. 回調函數的優勢:
>>1.  它可以讓我們在不做命名的情況下傳遞函數(這意味着可以節省全局變量)。
>>2.  我們可以將一個函數調用操作委託給另一個函數(這意味着可以節省一些代碼編寫工作)。
>>3.  它們也有助於提升性能。
③.  回調示例:
    function multiplyByTwo(a , b , c) {  
var i ,ar = [ ] ;
for ( i = 0 ; i <  3 ; i++) {
ar [ i ] = arguments [ i ] * 2;
}
return ar;
}
 function addOne( a ) { 
return a +1 ;
   }
現在,我們來測試一下這兩個函數:
>>>  multiplyByTwo( 1, 2, 3 );
運行結果:[ 2, 4 ,6 ]
>>>  addOne( 100 );
運行結果:101
接下來,我們要實現這三個元素在兩個函數之間的傳遞,這需要定義一個用於存儲元素的數組。我們先從multiplyByTwo ( ) 的調用開始:
>>>  var myarr = [ ] ;
>>> myarr = multiplyByTwo ( 10 , 20 ,30 );
運行結果: [ 20 , 40 ,60 ] 
然後,用循環遍歷每個元素,並將它們分別傳遞給 addOne() 。
>>>  for ( var i =0 ; i < 3; i++ ) {  myarr [ i ] = addOne (myarr [ i ] );}
>>>  myarr
運行結果: [21 ,41, 61]
如您所見,這段代碼可以工作,但是顯然還有一定的改善空間。特別是這裏使用了兩個循環,如果數據量很大或循環操作很複雜的話,開銷一定不小。因此,我們需要將它們合二爲一。這就需要對multiplyByTwo() 函數做一些改動,使其接受一個回調函數,並在每次迭代操作中調用它。具體如下:
function multiplyByTwo (a , b, c, callback) { 
  var i , ar = [ ];
for ( i = 0 ; i< 3 ; i ++){
ar [ i ]  = callback(arguments [ i ] * 2); 
}
return ar;
}
函數修改完成後,之前的工作只需要一次函數調用就夠了,我們只需像下面初始值和回調函數傳遞給它即可:
>>>   myarr = multiplyByTwo ( 1 ,2 ,3, addOne );
運行結果:[ 3, 5, 7]
我們還可以用匿名函數來代替addOne(),這樣做可以節省一個額外的全局變量。
>>>  myarr   = multiplyByTwo( 1, 2, 3, function (a ) { return  a + 1} );
運行結果:[3 , 5 , 7]
而且,使用匿名函數也更易於隨時根據需求調整代碼。例如:
>>>   myarr = multiplyByTwo ( 1 ,2 ,3, function( a ) { return a + 2; } );
運行結果:[4, 6, 8]
 
 
3.2   自調函數
目前我們已經討論了匿名函數在回調方面的應用。接下來,我們來看匿名函數的另一個應用示例——這種函數可以在定義後自行調用。比如:
{
function (){
alert( 'boo' );
}
 
 
}( )
這種語法看上去有點嚇人,但其實很簡單——我們只需要將匿名函數的定義放進一對括號中,然後外面再緊跟一對括號即可。其中,第二對括號起到是“立即調用”的作用,同時它也是我們向匿名函數傳遞參數的地方。
(
function ( name ) {
alert( ' hello ' + name + ' ! ');
}
)('dude')
使用自調匿名函數的好處在於這樣不會產生任何全局變量。當然,缺點是這樣的函數是無法重複執行的(除非您將它放在某個循環或其它函數中)。這也使得匿名自調函數最適合於執行一些一次性的或初始化的任務。

 

函數篇之——函數也是數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章