JavaScript函数分别返回False和0

拉玛

我是JavaScript新手,正在尝试编写函数式编程以计算数字是否为奇数(isOdd)。我不明白为什么我连续两次调用isOdd()时得到true或0或false和1。

这是我的代码:

var mod = m => {return number => {return number % m }}
var eq = number1 => {return number2 => {return number1 === number2}}
var combine = (...fns) => { return arg => {for(let fn of fns.reverse()) arg = fn(arg); return arg;}}

var eq1 = eq(1)
var mod2 = mod(2)
var isOdd = combine(eq1, mod2)

mod2(4) -----> returns 0
mod2(3) -----> returns 1
eq1(1)  -----> returns true
eq1(2)  -----> returns false

isOdd(1) returns true
isOdd(1) returns 1 (what??)

我不明白自己错过了什么或出了什么问题。我在大多数浏览器中测试了此代码。

欣赏是否有人可以详细解释。

我可以再次包装isOdd并得到类似

isOdd = (number) => {return Boolean(combine(eq1, mod2))}

每次都会返回布尔值。但是我想了解我最想念的东西/

用户名

Array.prototype.reversefns就地反转数组。你打电话.reversefns ,每次你打电话isOdd,即使你在传递功能的固定参数列表combine 一次该列表的作用范围是combine每次调用时都将其反转isOdd(1)

换句话说,您的第一个isOdd(1)电话会记住fns您原始combine(eq1, mod2)电话阵列fns[ eq1, mod2 ]然后您调用fns.reverse()以对其进行迭代;但这种变异 fns[ mod2, eq1 ]您得到正确的结果,因为您想以相反的顺序调用这些函数。产生的呼叫为eq1(mod2(1)) === eq1(1) === true

在你的第二个isOdd(1)电话,然而,fns仍然记得,它仍然具有反转的[ mod2, eq1 ]价值,因为它的范围combine,那么另一个isOdd调用不会重置最初传递fns第二次isOdd调用再次颠倒了此数组因为在中fns.reverse被调用了isOdd产生的呼叫是mod2(eq1(1)) === mod2(true) === 1(因为true % 2被强制到1 % 2)。

工作函数如下所示:

const combine = (...fns) => {
    const reversedFns = fns.reverse();

    return (arg) => {
      for(let fn of reversedFns){
        arg = fn(arg);
      }
  
      return arg;
    };
  };

一个更简单的方法是Array.prototype.reduceRight

const combine = (...fns) => (arg) => fns.reduceRight((result, fn) => fn(result), arg);

由于您要基于从右到左的列表将多个操作聚合到单个结果上,因此reduceRight是一种理想的方法。您从开始arg,从右到左浏览功能列表,然后使用调用当前功能arg,这将成为arg下一个功能的新功能。返回最终结果。所有这些都由代码捕获fns.reduceRight((result, fn) => fn(result), arg)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可变函数分别调用lambda和传递参数

来自分类Dev

Prolog:递归函数分支和“返回”

来自分类Dev

JavaScript函数始终返回false

来自分类Dev

从函数分配和返回堆栈上的QSharedPointer

来自分类Dev

Pygame的colliderect()函数返回0(零)和1(一)而不是True和False?

来自分类Dev

PHP函数返回0 vs false

来自分类Dev

C ++:可以在布尔函数中将0或1的值返回为false和true吗?

来自分类Dev

如果不是0和1,则返回false

来自分类Dev

如果不是0和1,则返回false

来自分类Dev

将函数分别应用于列的每个元素

来自分类Dev

返回false后运行的Javascript函数

来自分类Dev

Javascript:比较标准函数总是返回* false *

来自分类Dev

是否有一个函数分别使用两个转换函数来转换/映射“左”和“右”情况?

来自分类Dev

在javascript中,[] === []和[] == []都返回false

来自分类Dev

Javascript 返回 false 和 event.target

来自分类Dev

仅在'beforeunload'函数返回false时运行Javascript函数

来自分类Dev

MySQL:返回“ 0”和“ 1”,而不是“ false”和“ true”

来自分类Dev

返回true或false的数字0或1的map函数

来自分类Dev

返回true或false的数字0或1的map函数

来自分类Dev

Ajax函数问题在wordpress中返回true和false

来自分类Dev

lambda函数返回false

来自分类Dev

函数总是返回false

来自分类Dev

JavaScript的承诺和函数的返回差异

来自分类Dev

如果我的JavaScript函数返回false,如何防止表单动作?

来自分类Dev

返回false似乎在此javascript函数中不起作用

来自分类Dev

使用eval进行JavaScript函数分配

来自分类Dev

javascript不会返回false

来自分类Dev

JavaScript:onclick并返回false

来自分类Dev

js函数中的toString返回undefined和0值

Related 相关文章

热门标签

归档