Как обновить деструктурированную переменную JavaScript на основе областей / замыканий? - PullRequest
0 голосов
/ 16 мая 2019

Следующий код ниже представляет собой деструктурированную переменную переменную и увеличенияCount функцию обновления.

Как мне обновить значение переменной count в любое время, когда я выполняю функцию increment_ount ?

Это вообще возможно?

Примечание : я не хочу, чтобы переменная count была Global variable.

Из приведенного ниже кода я попытался использовать Closures для решения проблемы. Но 1 по-прежнему отображается даже после второго console.log .

function getCount() {
    let _count = 1;

    const _updateCount = () => {
        _count = _count + 1;
    };

    return [_count, _updateCount];


}

const [count, updateCount] = getCount();


console.log(count); /* <===== Expect initial count to be 1 */

updateCount();

console.log(count); /* <===== After calling updateCount I Expect count to be 2 */
  1. Я ожидаю, что count будет 1 при вызове first console.log .

  2. Когда вызывается updateCount , я ожидаю, что переменная count будет обновлена ​​до 2 .

  3. Поэтому, когда вызывается второй console.log , я ожидаю, что будет отображаться 2 .

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Область действия _count отличается от области действия count, которую вы пытаетесь console.log

Чтобы показать значение _count, вам необходимо получить к нему доступ с помощью функции, подобной этой:

function getCount() {
  // This is visibile only to the function getCount
  let _count = 1;

  const _updateCount = () => {
    _count = _count + 1;
  };

  const _showCount = () => {
    console.log(_count);
  }

  return [_count, _updateCount, _showCount];
}

// Count here will be a different variable
const [count, updateCount, showCount] = getCount();


console.log(count); /* <===== Expect initial count to be 1 */

updateCount();
showCount(); // Will show ===> 2

updateCount();
showCount(); // Will show ===> 3
1 голос
/ 16 мая 2019

Вы можете использовать объект с реализованным методом toString и использовать эту переменную в примитивной среде ожидания для получения счетчика.

function getCount() {
    let _count = 1;
    const _updateCount = () => {
        _count = _count + 1;
    };
    return [{ toString: () => _count }, _updateCount];
}

const [count, updateCount] = getCount();
console.log(count + '');
updateCount();
console.log(count + '');
1 голос
/ 16 мая 2019

Учитывая ваш текущий код, это невозможно, если вы хотите иметь возможность вызывать getCount более одного раза - вы деструктурировали count, примитив верхнего уровня.Единственный способ изменить это - переназначить внешнюю переменную внутри getCount, что является плохой идеей.

let count;
function getCount() {
    count = 1;

    const _updateCount = () => {
        count = count + 1;
    };

    return _updateCount;
}

const updateCount = getCount();


console.log(count); /* <===== Expect initial count to be 1 */

updateCount();

console.log(count); /* <===== After calling updateCount I Expect count to be 2 */

Простым решением было бы не поместить примитив в первое место в массиве, а вместо этого использовать функцию, которая возвращает внутреннюю часть _count:

function getCount() {
    let _count = 1;

    const _updateCount = () => {
        _count = _count + 1;
    };

    return [() => _count, _updateCount];


}

const [getInternalCount, updateCount] = getCount();


console.log(getInternalCount()); /* <===== Expect initial count to be 1 */

updateCount();

console.log(getInternalCount()); /* <===== After calling updateCount I Expect count to be 2 */
...