web-dev-qa-db-fra.com

Javascript variable de portée pour changer de casse?

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
}

6
Philip Kirkbride

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 (...) ...
})();
4
deceze

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 */
28
Fatma Nabilla

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);
2
skyline3000

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);
0
ajaysinghdav10d