gpt4 book ai didi

javascript - 如果不在 switch case 中声明 block 范围,是否会导致内存泄漏? (ESLint 无案例声明)

转载 作者:行者123 更新时间:2023-11-29 16:04:44 27 4
gpt4 key购买 nike

以这段代码为例;它是一个 Redux reducer 函数:

export default (state = initialState, action) => {
switch (action.type) {
case EMPLOYEE_UPDATE: { // <-- this {
// action.payload === { prop: 'name', value: 'Jane' }
const { prop, value } = action.payload
return { ...state, [prop]: value }
} // <-- and this }

default:
return state
}
}

我只是试图解构 action.payload 以尽量减少重复,我注意到它加剧了 ES Lint 规则(no-case-declarations)。通常,我可能会在确认规则后将其关闭。由于这个 ES Lint 定义,这个看起来更严重:

...The reason is that the lexical declaration is visible in the entire switch block but it only gets initialized when it is assigned, which will only happen if the case where it is defined is reached.

Source: https://eslint.org/docs/rules/no-case-declarations

如果我没记错的话,这是否意味着编译器将始终保持对 action.payload 的引用? -- 这意味着如果一个大循环、数据集或长时间运行的计算进入那里,它可能会导致大量内存消耗,即使该案例仅在匹配时执行 因为它不能被垃圾收集或忽略?

首先,我的解释是否正确?

我的问题的本质是关于 {} 在此执行上下文/词法环境中究竟要防止什么。仅仅是内存泄漏的可能性,还是有一个我没有提到的话题?

最佳答案

问题:

switch (true) {
case false:
let x = 10;
break;
case true:
let x = 20; //error there's already an x declaration in scope
break;
}

所有情况都共享相同的词法范围。所以这个例子运行出错。

因此,解决此问题的方法是添加 block 语句以引入 block 作用域并本地化词法声明。

switch (true) {
case false:
{
let x = 10;
break;
}
case true:
{
let x = 20;
break;
}
}

这与内存问题无关。除了 switch block 内的初始化绑定(bind)(最终应该是 GC)。

关于javascript - 如果不在 switch case 中声明 block 范围,是否会导致内存泄漏? (ESLint 无案例声明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614428/

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