在不使用arguments.callee的情况下递归调用匿名函数

时间:2015-05-30 09:30:54

标签: javascript

如何以递归方式(从内部)调用匿名函数?

(function(n) {
    console.log(n=n-1);
    // Want to call it recursively here without naming any function
})(20);

3 个答案:

答案 0 :(得分:4)

只需命名即可。在这种情况下,无论如何都不能在括号外使用该函数 - 因此您不会使用它来污染命名空间。

(function recursive(n) {
  console.log(n = n - 1);
  if (n > 0) {
    recursive(n); // just an example
  }
})(20); 

//recursive(20); // won't be able to call it here...

答案 1 :(得分:2)

从纯粹的理论角度来看,如果你真的想避免任何名称,你可以使用" Y组合器",这基本上是一种用自己调用函数的方法作为一个论点:



(function (le) {
    return (function (f) {
        return f(f);
    }(function (f) {
        return le(function (x) {
            return f(f)(x);
        });
    }));
})(function (f) {
    return function (n) {
        document.write(n + " ");
        if (n > 0) f(n - 1);
    }
})(20);




这里有good explanation如何运作。

答案 2 :(得分:1)

如果不使用arguments.callee,您将无法在没有名称的情况下调用它。但是,您可以这样命名函数:

(function repeat(n) {
    console.log(n);
    n = n - 1;
    if (n > 0) repeat(n);
})(20);