@raina77ow недавно помог мне разобраться в именах вычисляемых свойств. В рамках их ответа на мой вопрос они поделились действительно сложным кодом, демонстрирующим интересные аспекты JavaScript:
const increment = (() => { let x = 0; return () => ++x })();
const movingTarget = { toString: increment };
const weirdObjectLiteral = { [movingTarget]: 42 };
console.log( weirdObjectLiteral[movingTarget] ); // undefined
Когда я запускаю этот пример в интерфейсе командной строки узла, эта последняя строка постоянно выводит undefined
, а значение x
в increment
постоянно увеличивается.
Если мы заменим const movingTarget = { toString: increment };
на const movingTarget = { [toString]: increment };
, такое поведение перестанет иметь место, и вместо этого мы получим вывод 42
, а x
в increment
останется прежним.
Может ли кто-нибудь помочь мне понять, почему это так? Что такого в JavaScript, что заставляет все работать именно так?
Похожий вопрос: существует ли x
в функции внутри increment
, пока мы явно не удалим increment
из памяти?