1

考虑以下代码:

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

(感谢 zzzzBov 的这个小金块)

这是一个“for”-less 循环

以及以下内容:

a=b=>b+1

鉴于这两个片段,以及以下事实:

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

我期望这会导致 z 等于 10,而是在 JavaScript 控制台中返回以下内容"TypeError: c is not a function",如何更改此代码以确保循环继续进行,而不必诉诸 a whileorfor循环?

我问这个是出于教育目的...希望我能对可以做的事情有所了解...

4

2 回答 2

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.log15 次。

当然,要在第二位中实现您想要的,您可以使用以下命令:

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

这将是一个增加z1的常规箭头函数

看一下babel上的代码

希望我能帮上忙!

于 2015-07-21T23:41:37.843 回答
0

It sounds you are looking for a folding function (like array reduce), not a simple "looping" function that only executes side effects. With that current function, which desugars f(5, c) to effectively c(); c(); c(); c(); c(); you would need to do

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

If however you want to make a function that repeatedly applies a function, like a(a(a(a(a(…))))), you would need to write

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

so that you can do

let a = b=>b+2
times(5, a, 0) // 10
于 2015-07-22T02:00:02.593 回答