Javascript匿名函數的遞迴
Wed, 11 Apr 2007 21:50:04 +0800在mozilla網站上面看arguments的資料時看到一些匿名函數遞迴的方法....
匿名函數常用在一些Javascript Framework (Lib) 上,或是直接assign一個函數參考給物件變數時(可以減少或避免使用變數來避開變數名稱衝突的問題)。
雖然不知道自己什麼時候會用到匿名函數遞迴......但是匿名函數要遞迴的時候,不能透過this來參考,只能透過arguments.callee。以下是一個例子(階乘,從mozilla網站抄來的)
var t = (function (x) { if (x <= 1) {//'<'符號是全形的,不然顯示不出來.... return 1; } else { return x * arguments.callee(x-1); } })(5); alert(t);
這個函數是用遞迴的方式算出階乘,使用立刻執行的匿名函數。(函數前後的括號會把函數從定義改為敘述,後面的括號輸入參數傳給函數執行)我自己做了一個測試網頁,有興趣可以試試看效果。
另外舉一個以前做過的例子,計算給定元素的座標(相對於body):
var p = (function (o) { var currPos = {"x": o.offsetLeft, "y": o.offsetTop}; var workPos = {"x": 0, "y": 0}; if (o.offsetParent.tagName != "BODY" && o.offsetParent.tagName != "body") { workPos = arguments.callee(o.offsetParent); currPos.x += workPos.x; currPos.y += workPos.y; } else { return currPos; } })(obj);
這個例子會算出傳入元素(obj)相對於body的座標,也就是在網頁上的座標。我同樣做了一個測試網頁,有興趣可以試試看效果(在IE跟Firefox中結果不同喔)。
不過argument.callee除了用在匿名函數的遞迴中,其他地方好像都不太用得到了?