DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JS教程:匿名函數
JS教程:匿名函數
編輯:關於JavaScript     

網頁制作poluoluo文章簡介:匿名函數與遞歸:給匿名函數命名

毫無疑問,John Resig 是一個細致且善於思考的人,對於我們通常使用的匿名函數,在他的細究之下,也能挖掘出一些新的東西。通常情況下,當一個函數調用自身時,遞歸就出現了,對於下面這樣的函數調用,我們並不陌生。

1.function yell(n){
2.       return n > 0 ? yell(n-1) + "a" : "hiy";
3.}
4.alert( yell(4))//結果為:hiyaaaa;

單個函數看不出任何問題,如果我們使用匿名函數,並將其放置到一個對象內部,結果會怎樣?

1.var ninja = {
2.         yell: function(n){
3.                 return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
4.         }
5.};
6.alert( yell(4))//結果為:hiyaaaa;

現在我們看不出任何問題所在,如果我們創建一個新的對象,從ninja 那裡復制yell方法,情況就有所不同了。既然匿名函數在ninja 內部,那麼該方法仍是對ninja對象yell方法的引用。如果我們重新定義ninja對象,問題就出現了。


01.var ninja = {
02.           yell: function(n){
03.                 return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
04.          }
05.};
06.var samurai = { yell: ninja.yell };
07.var ninja = {};
08.try {
09.       alert(samurai.yell(4);
10.} catch(e){
11.       alert("Uh, this isn't good! Where'd ninja.yell go?" );
12.}
13.//結果是:"Uh, this isn't good! Where'd ninja.yell go?"

如何解決該問題?如何使yell方法更可靠?最常見的方法是在ninja.yell方法內部使用“this”來改變ninja對象的所有實例,即:

1.var ninja = {
2.          yell: function(n){
3.                return n > 0 ? this.yell(n-1) + "a" : "hiy";
4.         }
5.};

現在我們測試,將會得到我們需要的結果。這當然是一種方法,另外一種方法是給匿名函數命名,這看似矛盾,但的確能很好的工作,瞧:


01.var ninja = {
02.           yell: function yell(n){
03.                  return n > 0 ? yell(n-1) + "a" : "hiy";
04.           }
05.};
06.alert((ninja.yell(4)) + "  Works as we would expect it to!" );
07.var samurai = { yell: ninja.yell };
08.var ninja = {};
09.alert( (samurai.yell(4))+ "  The method correctly calls itself." );

給匿名函數命名可以更進一層,對於正常的變量聲明,我們也可以嘗試這樣做,如:


1.var ninja = function myNinja(){
2.        alert( (ninja == myNinja) + " This function is named two things - at once!" );
3.};
4.ninja();

運行上面的這個函數,在 IE中,我麼看到的是:”flase This function is named two things – at once!”,在FF中我們看到的是:”true This function is named two things – at once!”。作者曾指出:匿名函數可以命名,但只在函數自身內部可見。看來並不是那麼回事,測試結果表明,對於IE,並不可見,而在FF中,結果正如作者所料。同時,我們檢測myNinja,結果在IE和FF也有所不同。


1.alert( typeof myNinja);
2.//在FF中為"undefinde"
3.//在IE中為"function"

這樣看來,給匿名函數命名,在IE中,只在外部可見;在FF中,只在函數內部可見。其實,我們可以使用arguments.callee獲得我們所需要的結果,如下:


1.var ninja = {
2.            yell: function(n){
3.                   return n > 0 ? arguments.callee(n-1) + "a" : "hiy";
4.            }
5.};
6.alert( ninja.yell(4));

Arguments.callee是對於每一個函數都可以使用,它提供給我們一個可靠的方法去訪問函數自身。本人覺得,該方法比較簡潔可靠。

綜上所述,所有這些方法對我們處理復雜的代碼結構將大有裨益。選擇使用可以使我們的代碼結構更加簡潔明了,這也許是作者的初衷。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved