У меня есть следующий код:
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() как функцию, которая работает. Но я хочу понять, почему это так.
Вы обновляете
a
в сеттере, а неval
. Между ними нет связи.val
является копией значенияa
, а не ссылкой на переменную.Итак, если я сделаю val функцией, она будет иметь ссылку на переменную a при вызове? Как это работает, когда это функция @Barmar
@ Kevin.a Значение не имеет значения. При обновлении переменной другая переменная будет изменена только в том случае, если обе переменные одинаковы ссылка. Это невозможно с переменными в JS. Кроме того, изменить
val
все равно невозможно, потому что этоconst
. Вы можете попробовать это со свойствами объекта, которые содержат ссылки.@Kevin.a Kevin.a Когда это функция, вы создали замыкание, и оно сохраняет ссылку на свою переменную среду. Геттер и сеттер закрываются в одной и той же среде.
Ваш код эквивалентен
a = "initial"; val = a; a = "s";
Вы же не ожидаете, чтоval
изменится, не так ли?@Barmar спасибо, что помогли мне понять.