JS基礎教學:學習javascript匿名函數
毫無疑問,John Resig 是一個細緻且善於思考的人,對於我們通常使用的匿名函數,在他的細究之下,也能挖掘出一些新的東西。通常情況下,當一個函數調用自身時,遞歸就出現了,對於下面這樣的函數調用,我們並不陌生。
1.function yell(n){
2. return n > 0 ? yell(n-1) + "a" : "hiy";
3.}
4.alert(/ell(444)為:hiyaaaa;
單一函數看不出任何問題,如果我們使用匿名函數,並將其放置到一個物件內部,結果會如何?
1.var ninja = {
2. yell: function(n){
3.
4. }
5. };
6.alert( yell(4))//結果為:hiyaaaa;
現在我們看不出任何問題所在,如果我們創建一個新的對象,從ninja 那裡複製yell方法,情況就有所不同了。既然匿名函數在ninja 內部,那麼該方法仍是對ninja物件yell方法的參考。如果我們重新定義ninja對象,問題就出現了。
01.var ninja = {
02. yell: function(n){
03. a" : "hiy";
04. }
05 .};
06.var samurai = { yell: ninja.yell };
07.var ninja = {};
08.try {
09. ){
11. alert("Uh, this isn't good!Where'd ninja.yell go?" );
12.}
13.//結果為:"Uh, good is d ninja.yell go?"
2. yell: function(n){
3. }
5.};
現在我們測試,將會得到我們需要的結果。 ninja = {
03. 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
09.alert (samurai.yell(4))+ " The method correctly calls itself." );
給匿名函數命名可以更進一層,對於正常的變數聲明,我們也可以嘗試這樣做,如:
1 .var ninja = function myNinja(){
1.alert( typeof myNinja);
2.//在FF中為"undefinde"
3.//在IE中為"function"
這樣看來,給匿名函數命名,在IE中,只在外部可見;在FF中,只在函數內部可見。其實,我們可以使用arguments.callee來獲得我們所需要的結果,如下:
1.var ninja = {
2. yell: function(n){
3. a" : "hiy";
4. }
5. };
6.alert( ninja.yell(4));
Arguments.callee是對於每一個函數都可以使用,它提供給我們一個可靠的方法去存取函數本身。本人覺得,方法比較簡潔可靠。
綜上所述,所有這些方法對我們處理複雜的程式碼結構將大有裨益。選擇使用可以讓我們的程式碼結構更加簡潔明了,這也許是作者的初衷。
以上就是JS基礎教學:學習javascript匿名函數內容,更多相關文章請關注PHP中文網(www.php.cn)!