0

Nehmen Sie diesen Code zum Beispiel; es ist eine Redux Minderer Funktion:Führt es zu einem Speicherverlust, wenn Sie den Blockbereich nicht innerhalb eines Switch-Falls deklarieren? (ESLint no-case-declarations)

export default (state = INITIAL_STATE, 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 
    } 
} 

Ich habe lediglich versucht, um Doppelarbeit destrukturiert action.payload zu minimieren, und ich bemerkte, dass es die ES Lint Regel wurde erschwerende (no-Fall-Erklärungen). Normalerweise könnte ich es nach Bestätigung der Regel ausschalten. Dies scheint viel ernster aufgrund diesem ES Lint Definition:

... Der Grund dafür ist, dass die lexikalische Erklärung im gesamten Schalterblock sichtbar ist, aber es wird nur initialisiert, wenn sie zugeordnet ist, das nur passiert, wenn der Fall, wo es definiert ist, erreicht ist.

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

Wenn ich Speicherverlust Potenzial richtig erinnere, bedeutet das der Compiler einen Verweis auf action.payload jederzeit aufrechterhalten werden? - Bedeutet das, dass wenn eine große Schleife, ein Dataset oder eine lang laufende Berechnung dort hineingelangt, es massiven Speicherverbrauch verursachen könnte, obwohl der Fall nur dann ausgeführt wird, wenn übereinstimmt, weil es nicht garbage collected oder ignored sein kann?

In erster Linie, ist meine Interpretation richtig?

Die Natur meiner Frage ist um was genau { und } in diesem Ausführungskontext/lexikalische Umgebung schützen. Ist es nur Speicherleckpotential oder gibt es ein Thema, das ich auch nicht erwähnt habe?

+0

Diese Regel sieht für mich falsch aus. Sie haben einen Block um den Case-Code. – Pointy

+0

Nein, das bedeutet, dass Sie, wenn Sie in den Fällen keine Blockanweisungen umbrechen, die Deklarationen für alle Fälle freigeben. – MinusFour

+0

Die zusätzlichen Blöcke in den Fällen schützen Sie nur vor einer Variablenkollision, wenn Sie zwei Variablen mit demselben Namen in verschiedenen Fällen deklarieren. Ohne die geschweiften Klammern befinden sie sich im selben Block, dem 'switch'. Nicht mehr und nicht weniger. Wenn es ein Speicherleck geben würde, würden die Klammern nichts daran ändern. – Thomas

Antwort

2

Das Problem:

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

Die Fälle, alle den gleichen lexikalischen Gültigkeitsbereich. Das Beispiel führt also einen Fehler aus.

Also, eine Möglichkeit, dies zu beheben, ist eine Blockanweisung hinzuzufügen, um den Blockbereich einzuführen und die lexikalischen Deklarationen zu lokalisieren.

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

Es zu Speicher abgedeckter ist. Andere als initialisierte Bindungen innerhalb des Switch-Blocks (das sollte schließlich GC sein).

+0

Das macht eigentlich Sinn, wenn man bedenkt, dass sie sonst im Switch-Bereich wären. – agm1984

+0

Ja, Sie würden den gleichen Fehler mit doppelten lexikalischen Deklarationen innerhalb einer Funktion oder so erhalten. – MinusFour

Verwandte Themen