听到我的代码。我需要在不使用函数名的情况下完成工作。 虽然无法命名函数,但它们可以作为参数传递给另一个函数。
我不想使用arguments.callee。
任何人都可以帮助我。
其实这是我的任务。我需要在匿名函数中进行递归。我不能使用任何函数名称。但我可以将函数名称作为参数传递给另一个函数。 有没有办法替换arguments.callee。
var n=5; // The result should be 15
console.log((function sum(n) {
if (n ==0)
return n;
else
return n + sum(n-1);
})(n));
答案 0 :(得分:3)
您可以将代码包装在匿名函数中,在其中可以声明一个命名函数:
console.log((function(n){
function fib(n) {
if (n == 0) {
return n;
} else {
return n + fib(n - 1);
}
}
return fib(n);
})(n));
如果您想在没有命名函数的情况下完全执行此操作,只需通过将其作为参数传递给函数设置名称,那么您必须在每次调用中发送函数引用:
console.log((function(f, n){
return f(f, n);
})(function(f, n) {
if (n == 0) {
return n;
} else {
return n + f(f, n - 1);
}
}, n));
答案 1 :(得分:1)
您可以使用U-combinator:
const U = f => f(f);
const sum = n => n === 0 ? n : n + sum(n - 1);
const sum_ = U(h => n => n === 0 ? n : n + h(h)(n - 1));
sum(5); // 15
sum_(5); // 15
注意为了使用U
,必须如何调整传递的lambda(匿名函数):
n => n === 0 ? 1 : n + sum (n - 1) // named
h => n => n === 0 ? 1 : n + h(h)(n - 1) // anonymous
答案 2 :(得分:0)
您唯一的另一个选择是将函数存储在变量中。
var fib = function(n) { ... };
您必须以某种方式引用该功能。如果它不是命名的并且您不使用arguments.callee,那么您必须将引用存储在变量中。