Javascript 此函数从何处获取其值?
这是一本书中的一个例子。如果偶数为TRUE,则函数返回TRUE,否则返回FALSE。我不明白它是怎么工作的。这就是我的理解: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)=>!偶数
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。是真的吗?因为每次调用它时,返回值都与下一个值相反。其实不需要知道有多少次。如果调用过一次,则返回为!真的,那么假。如果是两次,那就是!!真的,真的。三次!!!真的,又是假的,等等。