正如许多人所建议的那样,命名函数表达式的一种用法是递归调用自身。但是,似乎在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中,它表示“如果你想引用函数体内的当前函数,你需要创建一个命名函数表达式。”但是,在我看来,该语句并不正确,因为您仍然可以引用函数体内的当前函数而不为其分配函数标识符
任何想法都将不胜感激
答案 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