У меня вопрос о приращении JS (++). Я знаю, что многие люди здесь задавали вопрос о ++ и +1 различиях в JS, но ни один из них не упоминал об этом в рекурсивном вызове.
ВОПРОС: Я хочу вызывать функцию 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);
Почему в этом примере он действует как различие? Является ли мой рекурсивный звонок неправильным?
index++
- это приращение. Это означает, что он увеличивает эту переменную, но значение выражения - это старое значение. Так:
exec(index++);
эквивалентно:
var oldindex = index;
index += 1;
exec(oldindex);
Таким образом, рекурсивный вызов использует старое значение, что означает, что вы продолжаете называть рекурсивно с тем же значением и никогда не попадаете в предел, который перестает рекурсировать.
Вам нужно использовать pre-increment, который увеличивает эту переменную и возвращает новое значение:
exec(++index);
На самом деле, нет причин для приращения переменной вообще, так как вы никогда не используете ее снова в этой функции. Просто делать:
exec(index + 1);
Проблема с index++
заключается в том, что она является пост-инкрементом, поэтому она только увеличивает значение index
после того, как оно уже было передано обратно в exec
. Использование pre-increment (++index
) должно работать, так как оно будет увеличивать его до передачи его в рекурсивный вызов.
var exec = function(index){
console.log(index)
if(index<7){
exec(++index);
}
}
exec(0);
++i
противi++
. Если вы пытаетесь++i
это должно работать.i+1