递归的命名函数表达式
许多人都建议,命名函数表达式的用途之一是递归调用自身。但是,似乎在 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 中,它说“如果你想在函数体内引用当前函数,你需要创建一个命名的函数表达式”。但是,在我看来,这个说法并不正确,因为你仍然可以在函数体中引用当前函数,而无需为其分配函数标识符
任何想法都将不胜感激
由于没有条件限制递归,因此您已达到堆栈限制。
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
这是一个非常古老的帖子,但我会发布一些类似的内容, 因为在 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