gpt4 book ai didi

javascript - 返回数组/对象的闭包公开其词法上下文 : best way to tackle in JavaScript?

转载 作者:行者123 更新时间:2023-11-30 14:14:46 24 4
gpt4 key购买 nike

我想这可能是重复的,但我还无法找到解释。

这是我的示例代码:

const makeCalendar = () => {
const calendar = {};

calendar.xmas = ['December', 25];
calendar.newYear = ['January', 1];

return (day) => calendar[day];
}

calendar = makeCalendar();
const xmasArray = calendar('xmas');

console.log(calendar('xmas')); // [ 'December', 25 ]

xmasArray[1]++;

console.log(calendar('xmas')); // [ 'December', 26 ]

由于 xmasArray 的元素是可变的,我可以更改 makeCalendar() 范围内的变量,从而破坏它返回的闭包。我发现解决这个问题的唯一方法是返回一个匿名数组 [...calendar[day]](而不是 calendar[day]),然后阻塞makeCalendar() 中的访问。

我的问题是:这是处理这个问题的正确方法吗?有更好的方法吗?可能我没有正确理解发生了什么......

最佳答案

一种选择是使用 Object.freeze 禁止赋值给数组中的任何项目:

const makeCalendar = () => {
const calendar = {
xmas: ['December', 25],
newYear: ['January', 1]
};
Object.values(calendar).forEach(arr => Object.freeze(arr));
return (day) => calendar[day];
}

calendar = makeCalendar();
const xmasArray = calendar('xmas');

console.log(calendar('xmas'));

xmasArray[1]++;

console.log(calendar('xmas'));

请注意,这种尝试分配将在严格模式下抛出错误:

Uncaught TypeError: Cannot assign to read only property '1' of object '[object Array]

关于javascript - 返回数组/对象的闭包公开其词法上下文 : best way to tackle in JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53775748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com