Сброс счетчика защищенной / вложенной переменной в JavaScript - PullRequest
1 голос
/ 08 мая 2019

Я собираюсь создать безопасный счетчик и сбросить его, вызвав функцию. Я попробовал этот код:

function ZeroCounter () { var c = 0 ; return function() { return ++c } }; 

const Counter = ZeroCounter();

Но не сработало, как я ожидал. ZeroCounter не сбрасывается var C. Я заметил, что function() return создает новый объект.

var m = ZeroCounter(); var n = ZeroCounter();

m === n //return false

Я попробовал новый код для ZeroCounter.

function ZeroCounter () { var c = 0 ; ret = function() { return ++c }; return ret };

На самом деле, нет причин для новых результатов. Итак, что я могу сделать, чтобы достичь своего намерения: создать повторно загружаемую вложенную переменную? Или это невозможно?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

По сути, вы воссоздаете c каждый раз, когда выполняете ZeroCounter. Чтобы обойти это, переместите c за пределы ZeroCounter.

var c = 0;

function ZeroCounter() {
    return ++c;
}

var m = ZeroCounter();
var n = ZeroCounter();
console.log(m);
console.log(n);

Если вы хотите содержать c в ZeroCounter, но все же хотите получить эффект, используйте выражение Немедленно вызванная функция или IIFE

var ZeroCounter = (function () {

    var c = 0;

    return function () {
        return ++c;
    };

}());

var m = ZeroCounter();
var n = ZeroCounter();
console.log(m);
console.log(n);
0 голосов
/ 08 мая 2019

Вы можете использовать параметр функции и восстановить желаемое значение.

function counter() {
    var c = 0;
    return function(v) { 
        if (v !== undefined) c = v;
        return ++c
    };
}

const counterA = counter();

console.log(counterA());
console.log(counterA());
console.log(counterA());
console.log(counterA(0));
console.log(counterA());
console.log(counterA());
...