gpt4 book ai didi

Javascript 闭包返回字符串而不是函数

转载 作者:行者123 更新时间:2023-11-30 07:49:21 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的 compose 函数,它接受一系列函数,并像这样组合它们:

compose(func1, func2, func3)(n) === func1(func2(func3(n)))

我通过 rest 参数递归来做到这一点,

var compose = function(...args) {
return (n) => {
if (args.length) {
return args[0](compose(args.slice(1)));
} else {
return n;
}
};
};

然后我尝试组合一个由一系列其他函数组成的新函数,

var plusOneAndTwo = compose((n) => n + 1, (n) => n + 2);
plusOneAndTwo(1);

我没有返回 4,而是以字符串的形式返回了 compose 内部匿名函数的主体,

"(n) => {
if (args.length) {
return args[0](compose(args.slice(1)));
} else {
return n;
}
}1"

注意字符串末尾的 "1"!我不知道为什么会这样,尤其是我对如何将 1 附加到末尾感到困惑。

感谢任何澄清,谢谢!

最佳答案

问题出现在递归调用compose时。特别是,您没有将参数 n 传递给它(正如上面其他人所建议的)。此外,您需要在调用中扩展 rest 参数。

你应该使用类似的东西:

return args[0](compose(...args.slice(1))(n))

在你的例子中,你只是返回:

return args[0](compose(args.slice(1)));

在您的示例中,您调用了 compose((n) => n + 1, (n) => n + 2);。然后 Compose 返回一个以 n 作为参数的函数。在此函数中,args.length 变为 1(即 true-is),args[0] 变为 (n) => n + 1 并且 args.slice(1) 变为 [(n ) => n + 2]

接下来,您使用参数 n = 1 调用此返回函数。由于 args.length 为 1,if() 语句将进入 if() 案例。在这种 if 情况下,它将使用参数 compose(args.slice(1)) 调用 args[0]。

在这个递归调用中,compose(args.slice(1)) 被评估为一个函数,以 n 作为参数和相同的函数体。然后将此函数作为参数 n 提供给 args[0](在外部调用中)。回想一下,此场景中的 args[0] 是函数 (n) => n + 1

因此整个调用等同于:

// returned from the recursive call to compose(args.slice(1))
var n = (n) => {
if (args.length) {
return args[0](compose(args.slice(1)));
} else {
return n;
}
}
// applied to arg[0] == (n) => n + 1
return n + 1

这意味着代码将尝试添加一个编号为 1 的函数。在 JavaScript 中,添加一个函数和一个数字会导致两个对象都被强制转换为一个字符串。将数字转换为字符串很简单,将函数转换为字符串会返回函数源代码。然后添加这些字符串以提供您看到的返回值:函数体作为字符串,末尾为 1。

关于Javascript 闭包返回字符串而不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56043701/

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