webentwicklung-frage-antwort-db.com.de

Javascript-Bereichsvariable, um zwischen Fall zu wechseln?

In C können Sie eine Variable auf einen Schalterfall wie this anwenden.

Mit Javascript bekomme ich ein unerwartetes Token, das Folgendes verwendet:

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
}

Gibt es eine andere Möglichkeit, dies zu tun, oder sollte ich meine Variablen nur außerhalb des Switches deklarieren? 

BEARBEITEN:

Dies ist eine Problemlösung, die ich in Betracht gezogen habe, aber es hat nicht funktioniert. Der Grund ist, dass jeder Fall seinen eigenen Geltungsbereich hat.

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

Da var ohnehin Variablen im Bereich function erstellt, ist die Verwendung ziemlich sinnlos. Damit dies mit einer Granularität unterhalb der Funktionsbereiche funktioniert, müssen Sie let und einen Browser/Compiler verwenden, der dies unterstützt, und dann einen neuen Block einführen, für den Sie können Bereiche festlegen (In switch ist die Syntax einfach ungültig):

if (true) {
    let s;

    switch (i) {
        ...
    }
}

Dadurch wird s auf den if -Block angewendet, der in jeder Hinsicht mit dem hier angegebenen "switch -Bereich" identisch ist.

Wenn Sie let nicht unterstützen können, müssen Sie ein IIFE verwenden:

(function () {
    var s;

    switch (...) ...
})();
5
deceze

eine 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 */

oder

/* 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

Nein, das ist eine ungültige Syntax. Eine case- oder default-Anweisung wird innerhalb einer switch erwartet. Sie können die Spezifikation hier überprüfen: http://www.ecma-international.org/ecma-262/5.1/#sec-12.11

Sie können auch versuchen, Ihren Code in einem JSL-Intermit einzugeben, und dies ist ein Fehler: http://jslint.com/

Expected 'case' and instead saw 'var'.

Die Problemumgehung, die Sie in Betracht ziehen, wäre dieselbe, als würden Sie sie außerhalb der switch-Anweisung platzieren. Denken Sie daran, dass varfunction-Ebene hat, nicht Blockebene. Das heißt, sie sind an die gesamte Funktion gebunden, die den Switch enthält. Sie sollten sie außerhalb des Switches deklarieren, da sie dort erreichbar sind.

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

Es sollte außerhalb des Switches deklariert werden. Das unten könnte helfen:

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