web-dev-qa-db-de.com

Javascript-Konstante in einem try-Block gesetzt

Ist es in ES6 möglich, eine Variable innerhalb eines try{} mit const im strikten Modus zu setzen?

'use strict';

const path = require('path');

try 
{
    const configPath = path.resolve(process.cwd(), config);
} 
catch(error) 
{
    //.....
}

console.log(configPath);

Dies schlägt fehl, da configPath außerhalb des Gültigkeitsbereichs definiert ist. Die einzige Möglichkeit, wie dies zu funktionieren scheint, ist:

'use strict';

const path = require('path');

let configPath;
try 
{
    configPath = path.resolve(process.cwd(), config);
} catch(error) 
{
    //.....   
}

console.log(configPath);

Gibt es grundsätzlich const anstelle von let für diesen Fall?

11
Justin

Wenn Sie eine Variable als const deklarieren, müssen Sie sie sofort auf einen Wert zeigen. Diese Referenz kann nicht geändert werden.

Das heißt, Sie können ihn nicht an einer Stelle definieren (außerhalb von try) und ihm einen Wert an anderer Stelle (innerhalb von try) zuweisen. 

const test; // Syntax Error
try {
  test = 5; 
} catch(err) {}

Auf der anderen Seite ist das Erstellen und das Vergeben eines Werts innerhalb des try-Blocks in Ordnung.

try {
  const test = 5; // this is fine
} catch(err) {}

const hat jedoch einen Blockbereich, wie let. Wenn Sie also einen Wert erstellen und ihm einen Wert innerhalb Ihres try-Blocks zuweisen, ist er nur in diesem Bereich vorhanden.

try {
  const test = 5; // this is fine
} catch(err) {}
console.log(test); // test doesn't exist here

Wenn Sie also auf diese Variable außerhalb der try zugreifen müssen, müssen Sie let verwenden:

let configPath;
try {
   configPath = path.resolve(process.cwd(), config);
} catch(error) {
    //.....   
}

console.log(configPath);

Alternativ, obwohl wahrscheinlich verwirrender, können Sie var verwenden, um eine Variable innerhalb der try zu erstellen und außerhalb davon zu verwenden, da var innerhalb der Funktion und nicht innerhalb des Blocks (und erhält hoisted ) liegt:

try {
   var configPath = path.resolve(process.cwd(), config);
} catch(error) {
    //.....   
}

console.log(configPath);
41
nem035
'use strict';

const path = require('path');

const configPath = (function() {
  try {
    return path.resolve(process.cwd(), config);
  } catch (error) {
    //.....
  }
})()

console.log(configPath);
1
steph643

Ich würde versuchen, eine temporäre Variable mit let zu verwenden und diese nach dem const/try einer catch var zuzuweisen und die temporäre Var. Zu "löschen".

'use strict';

let temp;
try {
  temp = path.resolve(process.cwd(), config);
} catch (error) {
  //.....   
}

const configPath = temp;
temp = undefined;

console.log(configPath);
1
yunzen

Verwenden Sie let. Sie können keine const verwenden. const erlaubt keine erneute Zuweisung der deklarierten Konstante. Während es sich in der Regel bewährt hat, Objekte wie Ihres mit const zu deklarieren, besteht der gesamte Punkt dabei darin, Objekte mutieren zu lassen, ohne sie neu zuzuweisen. Sie weisen das Objekt neu zu (also den Zweck von const), verwenden Sie stattdessen let.

let path = require('path');
// Good to go!
0
Kyle Lin