web-dev-qa-db-fra.com

Javascript définit la variable const à l'intérieur d'un bloc try

Est-il possible dans ES6 de définir une variable à l'intérieur d'un try{} en utilisant const en mode strict?

'use strict';

const path = require('path');

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

console.log(configPath);

Cela échoue car configPath est défini hors de la portée. La seule façon dont cela semble fonctionner est de faire:

'use strict';

const path = require('path');

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

console.log(configPath);

Fondamentalement, est-il quand même possible d'utiliser const au lieu de let pour ce cas?

11
Justin

Déclarer une variable en tant que const nécessite que vous la dirigiez immédiatement vers une valeur et cette référence ne peut pas être modifiée.

Cela signifie que vous ne pouvez pas le définir à un endroit (en dehors de try) et lui attribuer une valeur ailleurs (à l'intérieur de try). 

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

D'autre part, il est correct de le créer et de lui attribuer une valeur dans le bloc try.

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

Cependant, const a une portée de bloc, comme let, donc si vous le créez et lui donnez une valeur dans votre bloc try, il n'existera que dans cette étendue.

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

Par conséquent, si vous devez accéder à cette variable en dehors de try, vous devez utiliser let:

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

console.log(configPath);

Alternativement, bien que probablement plus déroutant, vous pouvez utiliser var pour créer une variable dans la try et l’utiliser en dehors de celle-ci car var est délimité dans la fonction, pas dans le bloc (et obtient hoisted ):

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

J'essaierais d'utiliser une variable temporaire avec let et de l'attribuer à un const var après le try/catch et de "supprimer" la variable temporaire.

'use strict';

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

const configPath = temp;
temp = undefined;

console.log(configPath);
1
yunzen

Utilisez let. Vous ne pouvez pas utiliser const. const ne vous permet pas de réaffecter la constante déclarée. Bien qu'il soit généralement judicieux de déclarer des objets comme le vôtre avec const, le but de dans son ensemble est de permettre aux objets d'être mutés sans permettre leur réaffectation. Vous réaffectez l'objet (donc, en annulant l'objectif de const), utilisez donc let à la place.

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