用于递归的命名函数表达式

时间:2015-10-05 13:43:50

标签: javascript

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

编辑: 我知道这将是stackoverflow,但是,我希望输出像a() is not a function而不是Uncaught RangeError:超出最大调用堆栈大小(...)。

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

以下带有名称的函数表达式应该给我一个Uncaught RangeError:超出最大调用堆栈大小(...)。

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

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

任何想法都将不胜感激

1 个答案:

答案 0 :(得分:3)

您达到了堆栈限制,因为没有条件限制递归。

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