2015-07-21 82 views
1

考慮下面的代碼位:ES6箭頭符號與循環

f=(m,c)=>{m?c()&f(--m,c):0} 

(感謝zzzzBov這個小金塊)

這是一個「爲」循環稀少

和以下:

a=b=>b+1 

鑑於這兩個片段,以及一個事實:

z = 0; f(10,a(z)); 

我期望會導致沿z等同於10,而是返回在JavaScript控制檯以下"TypeError: c is not a function",一個將如何去改變這個代碼,以確保循環向前走,而不必訴諸一個whilefor循環?

我問這是教育目的的問題...希望我能得到一些見解,可以做些什麼...

+1

'A = b =>基礎b +'是沒有意義的實際 – zerkms

+0

@zerkms'A = b =>基礎b +'使得p當你意識到它相當於'a = function(b){return b ++;}' –

+0

'a = function(b){return b ++;}'也沒有任何意義。它和'a = function(b){return b; }' – zerkms

回答

2

f正在2個參數的函數:m,數量迭代,和c,該函數被稱爲m次。這意味着第二個參數c應該是一個函數。例如:

f=(m,c)=>{m?c()&f(--m,c):0} 


f(15, function() { 
console.log("Hello") 
}) 

這將通過c功能15次迭代,調用console.log 15倍。

當然,要實現你的第二位想要的東西,你可以這樣做:

z=0, f(10,()=>z++) 

這將是一個普通箭頭功能由1

增加z看看的代碼on babel

希望我能幫忙!

+0

謝謝...我知道有些事我錯過了......在循環函數中實現函數聲明是一種魅力......謝謝! –

0

這聽起來是你正在尋找一個摺疊功能(如數組reduce),而不是一個簡單的「循環」功能,只執行副作用。與目前的功能,desugars f(5, c)有效c(); c(); c(); c(); c();你需要做的

let z = 0; 
f(10,()=>{ z = a(z) }); 

然而,如果你想反覆適用的功能,像a(a(a(a(a(…)))))一個功能,你需要寫

let times = (n, f, s) => n>0 ? times(n-1, f, f(s)) : s; 

,這樣就可以做

let a = b=>b+2 
times(5, a, 0) // 10