agm*_*984 2 javascript garbage-collection memory-leaks switch-statement eslint
以下面的代码为例;它是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
}
}
Run Code Online (Sandbox Code Playgroud)
我只是在尝试对action.payload进行重组以最大程度地减少重复,并且我发现它加剧了ES Lint规则(无大小写声明)。通常,我可能会在确认规则后将其关闭。由于ES Lint的定义,这一点似乎更为严重:
...原因是词法声明在整个switch块中都是可见的,但仅在分配时才被初始化,只有在达到定义的情况下才会发生。
如果我没有记错内存泄漏的可能性,这是否意味着编译器将始终保持引用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;
}Run Code Online (Sandbox Code Playgroud)
这些案例都具有相同的词汇范围。因此,该示例运行错误。
因此,解决此问题的一种方法是添加一个block语句以引入block范围并本地化词汇声明。
switch (true) {
case false:
{
let x = 10;
break;
}
case true:
{
let x = 20;
break;
}
}Run Code Online (Sandbox Code Playgroud)
它与内存问题无关。除了switch块内的初始化绑定(最终应为GC)。