考虑以下代码:
f=(m,c)=>{m?c()&f(--m,c):0}
(感谢zzzzBov这个小金块)
是" for" -less loop
以及以下内容:
a=b=>b+1
鉴于这两个片段,以及:
z = 0; f(10,a(z));
我期望会导致z等于10,但是在JavaScript控制台中返回以下"TypeError: c is not a function"
,如何改变这段代码以确保循环继续,而不必诉诸到while
或for
循环?
我认为这是出于教育目的......希望我能够了解可以做些什么......
答案 0 :(得分: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++)
这将是一个常规箭头函数,可将z
增加1
查看代码on babel
希望我能帮忙!
答案 1 :(得分:0)
听起来你正在寻找折叠功能(如数组reduce
),而不是简单的循环"仅执行副作用的功能。使用当前功能,您需要做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