gpt4 book ai didi

javascript - 蹦床功能操作原理

转载 作者:行者123 更新时间:2023-11-29 20:41:41 24 4
gpt4 key购买 nike

function trampoline(f) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function sum(x, y) {
if (y > 0) {
// return sum(x + 1, y - 1); Maximum call stack size exceeded
return sum.bind(null, x + 1, y - 1); //100001
} else {
return x;
}
}
sum(1, 100000) //Maximum call stack size exceeded
let value= trampoline(sum(1, 100000))
console.log(value)

  1. 为什么要使用无堆栈溢出的 trampoline 函数
  2. 为什么蹦床函数中的求和函数需要bind

最佳答案

1.Why use trampoline functions without stack overflow

function 调用自身超过限制时,将抛出最大调用堆栈。在 trampoline 中有一个 while 循环而不是递归。所以它工作正常。

2.Why does the sum function in a trampoline function require bind

您可以在不使用 bind() 的情况下做到这一点。使用 Bind 是因为它返回一个新的 function。如果您使用包装函数,它仍然可以正常工作

function trampoline(f) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function sum(x, y) {
if (y > 0) {
// return sum(x + 1, y - 1); Maximum call stack size exceeded
return () => sum(x + 1, y - 1);
} else {
return x;
}
}
sum(1, 100000) //Maximum call stack size exceeded
let value= trampoline(sum(1, 100000))
console.log(value)

你可能会问为什么我们需要使用包装函数。因为如果我们不使用包装函数而只是简单地做

return sum(x + 1, y - 1);

会导致递归。当我们为包装函数或 bind() 返回一个新的 function 但未调用时,会发生递归并抛出错误。

关于javascript - 蹦床功能操作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com