Как задать переменную в рекурсивной функции, чтобы она объявлялась лишь раз
Хочу включить счетчик в рекурсивную функцию, но не знаю возможно ли объявить ее лишь один раз, чтобы при остальных циклах функции она бы только инкрементировалась, не обнуляя значение.
Ответы (2 шт):
С функциями можно обращаться как с обычными объектами (они наследуют от Object).
В том числе, и хранить считалку как свойство:
bubu();
function bubu() {
bubu.counter = (bubu.counter || 0) + 1;
console.log(bubu.counter);
if (bubu.counter < 10) bubu();
}
За счет логического ИЛИ ||, только на первой итерации, когда .counter — undefined (оно же, false), возьмется значение 0. Во всех остальных случаях - текущее значение counter.
Хотя, это можно организовать и так:
if (!bubu.counter) bubu.counter = 0;
bubu.counter++;
или
if (!++bubu.counter) bubu.counter = 0;
// !++undefined → !NaN → true
// !++0 → !1 → false
// !++1 → !2 → false
// ...
Либо передавай в качестве параметра (с) Grundy
bubu(0);
function bubu(i) {
i++;
console.log(i);
if (i < 10) bubu(i);
}
P.s. Везде нужно обращать особое внимание, где инкрементируете считалку, и на чем она заканчивается, чтобы не ошибиться на +/-1 итерацию.
function pow(x, n) {
foo();
return (n == 1) ? x : (x * pow(x, n - 1));
}
function foo () {
if (typeof foo.counter == 'undefined') {
foo.counter = 0;
}
foo.counter ++;
}
Попробуй этот код. Функция foo() имеет одну переменную счетчик. Функция не переопределяется при вызове из-за чего каждый раз просто инкрементируется.