En C, vous pouvez affecter une variable à un commutateur, comme this .
Avec javascript, je reçois un jeton inattendu en utilisant les éléments suivants:
const i = 1
switch (i) {
// variables scoped to switch
var s
var x = 2342
case 0:
s = 1 + x
break
case 1:
s = 'b'
break
}
Y a-t-il une autre façon de faire ou devrais-je déclarer mes variables en dehors du commutateur?
MODIFIER:
C'est une solution de contournement que j'ai envisagée mais qui n'a pas fini par fonctionner. La raison étant que chaque cas a sa propre portée.
const i = 1
switch (i) {
case i:
// variables scoped to switch
var s
var x = 2342
case 0:
s = 1 + x
break
case 1:
s = 'b'
break
}
Puisque var
crée des variables dans function scope de toute façon, son utilisation est plutôt inutile. Pour que cela fonctionne à une granularité inférieure aux étendues de fonctions, vous devrez utiliser let
et un navigateur/compilateur qui les prend en charge, puis introduire un nouveau bloc que vous pouvez étend les éléments (dans switch
, sa syntaxe est tout simplement invalide) :
if (true) {
let s;
switch (i) {
...
}
}
Cela étend s
au bloc if
qui, à toutes fins pratiques, est identique à "switch
portée".
Si vous ne pouvez pas prendre en charge let
, vous devrez utiliser un IIFE:
(function () {
var s;
switch (...) ...
})();
une alternative:
/* curly braces inside the case */
const i = 1
switch (i) {
case 0: {
let x = 2342;
let s = 1 + x;
console.log(x+' & '+s+' from inside');
} break;
case 1: {
let x = 2342;
let s = 'b';
console.log(x+' & '+s+' from inside'); /* 2342 & b from inside */
} break;
}
console.log(x+' & '+s+' from outside'); /* Uncaught ReferenceError */
ou
/* curly braces outside the switch */
const i = 1
{
let x = 2342;
let s;
switch (i) {
case 0:
s = 1 + x;
break;
case 1:
s = 'b';
break;
}
console.log(x+' & '+s+' from inside'); /* 2342 & b from inside */
}
console.log(x+' & '+s+' from outside'); /* Uncaught ReferenceError */
Non, c'est une syntaxe invalide. Une déclaration case
ou default
est attendue dans un switch
. Vous pouvez vérifier les spécifications ici: http://www.ecma-international.org/ecma-262/5.1/#sec-12.11
Vous pouvez également essayer d'entrer votre code dans un JSLinter et constater qu'il s'agit d'une erreur: http://jslint.com/
Expected 'case' and instead saw 'var'.
La solution de contournement que vous envisagez serait la même chose que de les placer en dehors de l'instruction switch. Rappelez-vous, var
a fonction- portée de niveau, pas portée de niveau bloc. Cela signifie qu'ils sont liés à la totalité de la fonction contenant le commutateur. Vous devriez les déclarer en dehors du commutateur, car c'est là qu'ils sont accessibles.
const i = 1;
var s;
var x = 2342;
switch (i) {
case 0:
s = 1 + x;
break;
case 1:
s = 'b';
break;
default:
break;
}
console.log("s is " + s);
Il devrait être déclaré en dehors du commutateur. Ce qui suit pourrait aider:
var i = 1, x = 2342;
var s;
switch (i)
{
case 0:
s = 1 + x;
break;
case 1:
s = 'b';
break;
}
console.log("s is " + s);