【问题标题】:ES6 Arrow Notation with Loops带有循环的 ES6 箭头符号
【发布时间】:2015-07-21 23:13:18
【问题描述】:

考虑以下代码:

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

(感谢 zzzzBov 提供的这个小金块)

这是一个“for”-less 循环

以及以下内容:

a=b=>b+1

鉴于这两个 sn-ps,以及以下事实:

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

我希望 z 等于 10,但在 JavaScript 控制台中返回以下 "TypeError: c is not a function",如何更改此代码以确保循环继续进行,而不必求助于whilefor 循环?

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

【问题讨论】:

  • a=b=>b++ 实际上没有意义
  • @zerkms a=b=>b++ 当你意识到它等同于 a = function(b){return b++;} 时,它是非常有意义的
  • a = function(b){return b++;} 也没有任何意义。和a = function(b) { return b; }一模一样
  • @zerkms 编辑更有意义...a=b=>b+1 怎么样?
  • a=b=>b+1 确实更有意义

标签: javascript recursion ecmascript-6 arrow-functions


【解决方案1】:

函数f 有两个参数: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

希望我能帮上忙!

【讨论】:

  • 谢谢...我知道我错过了一些东西...在循环函数中实现函数声明很有效...谢谢!
【解决方案2】:

听起来您正在寻找折叠函数(如数组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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 2016-12-08
    • 2019-12-17
    • 2016-12-22
    • 2016-02-22
    • 2017-05-22
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多