2015-07-21 52 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