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除了用在匿名函數的遞迴中,其他地方好像都不太用得到了?