значение переменной не меняется после обновления

avatar
Kevin.a
1 июля 2021 в 20:45
55
1
-1

У меня есть следующий код:

function change(initial) {
  let a = initial;
  console.log(a);
  return [
    a,
    (v) => {
      a = v;
    }
  ];
}

const [val, setter] = change("initial");

console.log(val);
setter("s");
console.log(val);

Вэл остается прежним, хотя был вызван сеттер. https://codesandbox.io/s/youthful-sun-ewqts?file=/src/index.js:0-212

Если вместо этого я изменю оператор return на это:

  return [
    () => a,
    (v) => {
      a = v;
    }
  ];

, а затем вызовите val() как функцию, которая работает. Но я хочу понять, почему это так.

Источник
Sebastian Simon
1 июля 2021 в 20:48
1

Вы обновляете a в сеттере, а не val. Между ними нет связи.

Barmar
1 июля 2021 в 20:50
1

val является копией значения a, а не ссылкой на переменную.

Kevin.a
1 июля 2021 в 20:53
0

Итак, если я сделаю val функцией, она будет иметь ссылку на переменную a при вызове? Как это работает, когда это функция @Barmar

Sebastian Simon
1 июля 2021 в 20:53
1

@ Kevin.a Значение не имеет значения. При обновлении переменной другая переменная будет изменена только в том случае, если обе переменные одинаковы ссылка. Это невозможно с переменными в JS. Кроме того, изменить val все равно невозможно, потому что это const. Вы можете попробовать это со свойствами объекта, которые содержат ссылки.

Barmar
1 июля 2021 в 20:55
0

@Kevin.a Kevin.a Когда это функция, вы создали замыкание, и оно сохраняет ссылку на свою переменную среду. Геттер и сеттер закрываются в одной и той же среде.

Barmar
1 июля 2021 в 20:56
1

Ваш код эквивалентен a = "initial"; val = a; a = "s"; Вы же не ожидаете, что val изменится, не так ли?

Kevin.a
1 июля 2021 в 20:58
0

@Barmar спасибо, что помогли мне понять.

Ответы (1)

avatar
ErrorGamer2000
1 июля 2021 в 21:15
0

Вот что происходит:

  1. Функция вызывается с начальным значением "initial"
  2. Исходное значение сохраняется как "a"
  3. Массив возвращается с текущим значением "a": "initial"
  4. Вызывается функция Setter, и значение "a" изменяется внутри функции
  5. Значение массива остается прежним, поскольку значения не связаны

Как насчет этого:

function change(initial) {
  console.log(initial);
  return {
    get value() {
      return initial;
    },
    set value(v) {
      return initial = v;
    },
    setter: function(v) {
      return initial = v;
    }
  };
}

const obj = change("initial");

const { setter } = obj;

console.log(obj.value);
//initial
setter("s");
console.log(obj.value);
//s
obj.value = "val";
console.log(obj.value);
//val