Javascript 此函数从何处获取其值?

Javascript 此函数从何处获取其值?,javascript,function,inline-functions,Javascript,Function,Inline Functions,这是一本书中的一个例子。如果偶数为TRUE,则函数返回TRUE,否则返回FALSE。我不明白它是怎么工作的。这就是我的理解: 42与n结合 创建“偶数”函数 x与n结合,n=42 x!=0 启动“其他” 创建“奇数”函数 奇数(42-1) 发起“!偶数(41)” JS如何处理“偶数(41)”呢?真实从何而来?我的理解是,只有当x==0时,它才会返回TRUE document.write( ((n)=>{ 常数偶数=(x)=>{ 如果(x==0)返回true; 否则{ 常数奇数=(y)=>!偶数

这是一本书中的一个例子。如果偶数为TRUE,则函数返回TRUE,否则返回FALSE。我不明白它是怎么工作的。这就是我的理解:

  • 42与n结合
  • 创建“偶数”函数
  • x与n结合,n=42
  • x!=0
  • 启动“其他”
  • 创建“奇数”函数
  • 奇数(42-1)
  • 发起“!偶数(41)” JS如何处理“偶数(41)”呢?真实从何而来?我的理解是,只有当x==0时,它才会返回TRUE

    document.write(
    ((n)=>{
    常数偶数=(x)=>{
    如果(x==0)返回true;
    否则{
    常数奇数=(y)=>!偶数(y);
    返回奇数(x-1);
    }
    }
    返回偶数(n)
    })(42)
    
    )
    这是故意混淆的。遵循逻辑

    如果n不是0,我们创建一个名为odd的新函数,它调用偶数并反转偶数的布尔值

    然后我们用n-1调用该函数


    所以本质上,它就像一个while循环,你不断地从数字中减去1,然后在每一步的更深处颠倒它的正确性或错误性,直到你得到一个0。如果函数被调用的次数为偶数,则为偶数。如果它被称为奇数次,它就是奇数

    以下代码执行与本书示例相同的逻辑,包括使用递归,但如果使用非整数值或负值调用
    isEven
    ,则会阻止无限循环

    const isEven = (n) =>
    {
        const even = (x) =>  x ? !even(x-1) : true;
    
        return even( Math.abs(Math.floor(n)));
    }
    isEven( 42)
    
    现在,台架逻辑测试相当简单:

    even( 0) returns true;
    even( 1) returns !even( 1-1), which is !even(0), which is false;
    even( 2) returns !even( 2-1), which is !even(1), which is true;
    
    以此类推,以获得更高的数字。参数值的每一个增量都会执行一个额外的、递归的偶数调用,以补充它下面的数字的“偶数”,直到达到零为止,该数字被硬编码为偶数


    最终结果是,如果
    偶数
    被调用奇数次(对于偶数)
    isEven
    返回
    ;如果
    偶数
    被调用偶数次(对于奇数)
    isEven
    返回false

    这是一个递归函数,
    x===0
    是基本情况。是的,尝试手动写下递归,就像这里对阶乘所做的那样。例如,这似乎是一种很糟糕的方法,无法找到一个数字是偶数还是偶数odd@redu确实如此。我认为这是一堂关于递归的课,这是一堂非常糟糕的课。这段“代码”中最可怕、最丑陋和最恶心的部分是
    (n-1)
    次重新定义
    奇数
    函数。除了故意混淆之外,这也是一种非常低效的检查偶数或奇数的方法。我想这是为了演示递归,但它甚至不太擅长……同意,只是对OP做了相同的评论。我认为令人困惑的是,
    奇数
    是在
    偶数
    函数中的
    else
    块的范围内声明的——如果它们在同一级别上,就会更清楚。“这是否真的是故意的,这是个问题。”保罗,但它怎么知道函数被调用了多少次呢?例如,我们有(2)。奇数(2-1)不是零,并且它不会返回TRUE。是真的吗?因为每次调用它时,返回值都与下一个值相反。其实不需要知道有多少次。如果调用过一次,则返回为!真的,那么假。如果是两次,那就是!!真的,真的。三次!!!真的,又是假的,等等。