国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

JS教程:匿名函數(shù)

2024-09-06 12:40:59
字體:
供稿:網(wǎng)友

毫無疑問,john resig 是一個細致且善于思考的人,對于我們通常使用的匿名函數(shù),在他的細究之下,也能挖掘出一些新的東西。通常情況下,當(dāng)一個函數(shù)調(diào)用自身時,遞歸就出現(xiàn)了,對于下面這樣的函數(shù)調(diào)用,我們并不陌生。

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

單個函數(shù)看不出任何問題,如果我們使用匿名函數(shù),并將其放置到一個對象內(nèi)部,結(jié)果會怎樣?

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

現(xiàn)在我們看不出任何問題所在,如果我們創(chuàng)建一個新的對象,從ninja 那里復(fù)制yell方法,情況就有所不同了。既然匿名函數(shù)在ninja 內(nèi)部,那么該方法仍是對ninja對象yell方法的引用。如果我們重新定義ninja對象,問題就出現(xiàn)了。


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.//結(jié)果是:"uh, this isn't good! where'd ninja.yell go?"

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

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

現(xiàn)在我們測試,將會得到我們需要的結(jié)果。這當(dāng)然是一種方法,另外一種方法是給匿名函數(shù)命名,這看似矛盾,但的確能很好的工作,瞧:


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." );

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


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

運行上面的這個函數(shù),在 ie中,我么看到的是:”flase this function is named two things – at once!”,在ff中我們看到的是:”true this function is named two things – at once!”。作者曾指出:匿名函數(shù)可以命名,但只在函數(shù)自身內(nèi)部可見??磥聿⒉皇悄敲椿厥?,測試結(jié)果表明,對于ie,并不可見,而在ff中,結(jié)果正如作者所料。同時,我們檢測myninja,結(jié)果在ie和ff也有所不同。


1.alert( typeof myninja);
2.//在ff中為"undefinde"
3.//在ie中為"function"

這樣看來,給匿名函數(shù)命名,在ie中,只在外部可見;在ff中,只在函數(shù)內(nèi)部可見。其實,我們可以使用arguments.callee獲得我們所需要的結(jié)果,如下:


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是對于每一個函數(shù)都可以使用,它提供給我們一個可靠的方法去訪問函數(shù)自身。本人覺得,該方法比較簡潔可靠。

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 卢湾区| 涟水县| 新和县| 大足县| 临汾市| 金秀| 江达县| 舞钢市| 铜鼓县| 托里县| 吴江市| 托里县| 司法| 上杭县| 福贡县| 都匀市| 永年县| 丹东市| 凌源市| 漳浦县| 姜堰市| 万年县| 盐源县| 太康县| 武安市| 萝北县| 城市| 襄樊市| 靖西县| 临夏县| 修文县| 虹口区| 宁波市| 池州市| 灵山县| 长寿区| 昔阳县| 贵港市| 广宁县| 新营市| 开封市|