开发者问题收集

递归的命名函数表达式

2015-10-05
1220

许多人都建议,命名函数表达式的用途之一是递归调用自身。但是,似乎在 Chrome 控制台中,没有名称的函数表达式仍然可以这样做。

编辑: 我知道这将是 stackoverflow,但是,我希望输出类似 a() is not a function 而不是 Uncaught RangeError: Maximum call stack size reached(…)。

var a = function () { 
        a();
        }
a();

以下带有名称的函数表达式应该给我一个 Uncaught RangeError: Maximum call stack size reached(…)。

var a = function a () { 
           a();
        }
a();

编辑 2: 在此链接 https://developer.mozilla.org/en/docs/web/JavaScript/Reference/Operators/function 中,它说“如果你想在函数体内引用当前函数,你需要创建一个命名的函数表达式”。但是,在我看来,这个说法并不正确,因为你仍然可以在函数体中引用当前函数,而无需为其分配函数标识符

任何想法都将不胜感激

2个回答

由于没有条件限制递归,因此您已达到堆栈限制。

var a = function (i) { 
        console.log(i);
        if (i >= 10) {
          return;
        }
        else {
          a(++i);
        }
}
a(0);

以上是一个更好的示例,展示了此递归的实际工作示例。请注意,此处检查是否调用递归函数。输出如下:

0
1
2
3
4
5
6
7
8
9
10

您还可以在 解析时 成功定义此逻辑:

function a (i) { 
        console.log(i);
        if (i >= 10) {
          return;
        }
        else {
          a(++i);
        }
}
a(0);

至于函数定义的范围,此示例显示何时定义 a()

if (typeof a === 'undefined') {
  console.log('a is undefined before the definition');
}
else {
  console.log('a is defined before the definition');
}

var a = function () {
  if (typeof a === 'undefined') {
    console.log('a is undefined inside of a');
  }
  else {
    console.log('a is defined inside of a');
  }
}

a();

if (typeof a === 'undefined') {
  console.log('a is undefined after the definition');
}
else {
  console.log('a is defined after the definition');
}

此代码片段的输出如下:

a is undefined before the definition 
a is defined inside of a 
a is defined after the definition
Thomas Stringer
2015-10-05

这是一个非常古老的帖子,但我会发布一些类似的内容, 因为在 Kumar Chetan Sharma、Stoyan Stefanov 和 Ved Antani 合著的《Javascript:面向对象编程》 一书中有这样一句话: “函数声明不能​​有递归调用” 这句话是错误的,或者缺乏更全面的解释,因为这仍然有效。

var facto = function(n){
    if(n<=1) return 1;
    return n * facto(n - 1);
}

console.log(facto(3)) // 6
Christian Alzate
2022-10-24