Javascript 递归调用中的增量(i++)和(i+=1)
2018-01-12
2128
我对 JS 增量 (++) 有疑问。我知道这里有很多人问过 JS 中 ++ 和 +1 的区别,但他们都没有在递归调用语句中提到这一点。
问题: 我想在 exec 函数中递归调用函数 exec,但下面的脚本运行不正常。
var exec = function(index){
if(index<7){
exec(index++);
}
}
exec(0);
output: Uncaught RangeError: Maximum call stack size exceeded
所以我将脚本更改为以下内容,它运行良好。
var exec = function(index){
if(index<7){
exec(index+=1);
}
}
exec(0);
为什么它在这个例子中表现不同?我的递归调用错了吗?
2个回答
index++
是后增。这意味着它会增加变量,但表达式的值是
旧
值。因此:
exec(index++);
相当于:
var oldindex = index;
index += 1;
exec(oldindex);
因此递归调用使用旧值,这意味着您继续使用相同的值进行递归调用,并且永远不会达到停止递归的限制。
您需要使用预增,它会增加变量并返回 新 值:
exec(++index);
实际上,根本没有理由增加变量,因为您永远不会在该函数中再次使用它。只需执行:
exec(index + 1);
Barmar
2018-01-12
index++
的问题在于它是后增,因此它只会在
index
的值被传回
exec
之后才会增加其值。使用预增 (
++index
) 应该可行,因为它会在将其传递到递归调用之前增加其值。
var exec = function(index){
console.log(index)
if(index<7){
exec(++index);
}
}
exec(0);
CRice
2018-01-12