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

标签 javascript memory-leaks garbage-collection 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
    }
}

我只是试图解构 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/

相关文章:

java - 我的 Android 应用程序崩溃并显示 "Found invalid root: 0x2"

javascript - 如何在 JavaScript 中识别以相同开头但值不同的不同 id

javascript - 根据javascript中文本行数更改textarea的高度

javascript - 如何将类添加到新打开的窗口的 `body` ?

Java Tomcat "OutOfMemoryError: Java heap space"由无休止的 session 引起?

java - Java 可以在对象仍在范围内时完成对象吗?

go - Go 中的垃圾收集工作由谁来完成?

javascript - 如何不将点击事件传递给 react 中的 child ?

javascript - getImageData内存泄漏?

Javascript 内存分析 - IE6