如果不在开关盒内声明块作用域,是否会导致内存泄漏?(ESLint无大小写声明)

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块中都是可见的,但仅在分配时才被初始化,只有在达到定义的情况下才会发生。

资料来源:https : //eslint.org/docs/rules/no-case-declarations

如果我没有记错内存泄漏的可能性,这是否意味着编译器将始终保持引用action.payload?-意味着如果进入一个大的循环,数据集或长时间运行的计算,可能会导致大量的内存消耗,即使这种情况只有在它匹配时才执行,因为它不能被垃圾收集或忽略,所以会导致大量的内存消耗?

首先,我的解释正确吗?

我的问题的本质是围绕什么{以及}在此执行上下文/词汇环境中所要保护的内容。仅仅是潜在的内存泄漏,还是我没有提到的话题?

Min*_*our 6

问题:

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)。