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?
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);
'use strict';
const path = require('path');
const configPath = (function() {
try {
return path.resolve(process.cwd(), config);
} catch (error) {
//.....
}
})()
console.log(configPath);
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);
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!