曾經(jīng)看到過一些說法是"最讓人沮喪是,當(dāng)你推導(dǎo)出它(Y組合子)后,完全沒法兒通過只看它一眼就說出它到底是想干嘛",而我恰恰認(rèn)為這就是函數(shù)式編程的魅力,也是數(shù)學(xué)的魅力所在,精簡優(yōu)雅的公式,背后隱藏著復(fù)雜有趣的推導(dǎo)過程。
總結(jié)
務(wù)實點(diǎn)兒講,匿名函數(shù)的遞歸調(diào)用,在日常的js開發(fā)中,用到的真的很少。把這個問題拿出來講,主要是想引出對 arguments
的一些講解和對 Y組合子
這個概念的一個普及。
但既然講都講了,我們真的用到的話,該怎么選擇呢?來,我們喜聞樂見的benchmark下: 分別測試:
// fact fact(10) // Y(f => f(f))(fact => n => n <= 1 ? 1 : n * fact(fact)(n - 1))(10)// Y'const fix = (f) => f(f) const ygen = fix(fact2) ygen(10) // callee(function(n) {n<=1?1:n*arguments.callee(n-1)})(10)
環(huán)境:Macbook pro(2.5 GHz Intel Core i7), node-5.0.0(V8:4.6.85.28) 結(jié)果:
fact x 18,604,101 ops/sec ±2.22% (88 runs sampled)
Y x 2,799,791 ops/sec ±1.03% (87 runs sampled)