簡體   English   中英

如果不在開關盒內聲明塊作用域,是否會導致內存泄漏? (ESLint無大小寫聲明)

[英]Does it cause a memory leak if you do not declare block scope inside a switch case? (ESLint no-case-declarations)

以下面的代碼為例; 它是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規則( 無大小寫聲明 )。 通常,我可能會在確認規則后將其關閉。 由於ES Lint的定義,這一點似乎更為嚴重:

...原因是詞法聲明在整個switch塊中都是可見的,但僅在分配時才被初始化,只有在達到定義的情況下才會發生。

資料來源: 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塊內的初始化綁定(最終應為GC)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM