开发者问题收集

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