2016-12-06 9 views
1

Cでは、thisのように変数をスイッチケースにスコープできます。 JavaScriptで大文字と小文字を切り替えるJavascriptスコープ変数?

は、私が使用して予期しないトークンを取得し、次の

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 
 
}

これを行うための別の方法はありますか私はちょうどスイッチの外に私の変数を宣言する必要がありますか?

EDIT:

これは私が考えられ回避策ですが、それは作業を終了しませんでした。その理由は、それぞれのケースに独自の範囲があるからです。

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 
 
}

+1

あなた 'switch'文が無効です少なくとも「JS」で。ケース内または外部スイッチ内で変数を定義することができます。 – Ionut

+1

'switch'の外で' s'にアクセスしたがっているので、なぜ 'switch'文の中でスコープしようとしていますか? – deceze

+0

@decezeこれはほんの一例に過ぎず、これをやりたい多くの理由があります。 –

答えて

2

は、それはかなり無意味です使用して、とにかく機能スコープで変数を作成します。これを関数スコープの下で細かく動作させるには、letとそれをサポートするブラウザ/コンパイラを使用し、次に新しいブロックを導入する必要があります。スコープのもの(switchの構文が無効です):

if (true) { 
    let s; 

    switch (i) { 
     ... 
    } 
} 

これは、すべての意図や目的のために、ここで「switch範囲」と同じですifブロックへsをスコープ。

あなたがletをサポートできない場合は、生命維持を使用する必要がありますが:

(function() { 
    var s; 

    switch (...) ... 
})(); 
+1

最初の例は 'if'を全く必要としません。コードを '{}'で囲むだけです。 –

+0

オブジェクトリテラルとして解釈される状況がわからないので、私は安全な 'if'ステートメントを提案しました。確かに、あなたはそれなしでそれを試すことができます。 – deceze

+3

私はすでにそれを試しました。それは完全に合法です。 'if'の枝がオブジェクトリテラルと混乱しないように、ブロック全体を囲むこともできません。 –

-1

JavaScriptはスコープの3つのレベル定義:

  • グローバル - 機能にdelcaredない何
  • 機能 - 使用関数で宣言された何をvarキーワード
  • 関数またはブロック

    In order to get the the behavior you are looking for with a function:

    : -

  • ブロック範囲全体構造CREAEし、let

ので、使用してブロックコンテナ({})で宣言された何でも、次の2つの選択肢があり

const i = 1 
 

 
function doSwitch(data){ 
 

 
    // variables are not scoped to switch, but are 
 
    // scoped to the function, which only contains 
 
    // the switch. 
 
    var s; 
 
    var x = 2342; 
 
    
 
    switch (data) { 
 
    case 0: 
 
     s = 1 + x; 
 
     break; 
 
    case 1: 
 
     s = 'b'; 
 
     break; 
 
    default: 
 
     s = "other"; 
 
    } 
 

 
    console.log("s is " + s) 
 

 
} 
 

 
doSwitch(18);

Or, in order to get the functionality with a block using let

const i = 1; 
 

 
// Wrapping the switch in its own block allows for let to work: 
 
{ 
 
     // variables are not scoped to switch, but are 
 
     // scoped to the function, which only contains 
 
     // the switch. 
 
     let s; 
 
     let x = 2342; 
 
     
 
     switch (i) { 
 
     case 0: 
 
      s = 1 + x; 
 
      break; 
 
     case 1: 
 
      s = 'b'; 
 
      break; 
 
     default: 
 
      s = "other"; 
 
     } 
 

 
     console.log("s is " + s) 
 
} 
 

 
// Test: 
 
console.log(s, x); // ReferenceError

+1

スイッチの途中でそれを宣言することはできません。質問は –

+1

@DarrenSweeneyうん、ありがとう。最初はそれを捕まえていませんでした。回答が変更されました。 –

+0

新しい答えはよく見える+1 thx –

0

これは、スイッチの外に宣言する必要があります。以下は役に立ちます:

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

いいえ、これは無効な構文です。 またはdefaultステートメントは、switchの範囲内であると予想されます。あなたがここに仕様を確認することができます:http://www.ecma-international.org/ecma-262/5.1/#sec-12.11

をまたJSLinterにあなたのコードを入力しようとすると、このエラーが発生することを確認できます。http://jslint.com/

Expected 'case' and instead saw 'var'. 

はあなたが検討している回避策は同じものになるでしょうそれらをswitchステートメントの外側に置く。覚えておいてください、var関数レベルスコープではなく、ブロックレベルスコープです。つまり、スイッチを含む関数全体にバインドされています。そのスイッチはアクセス可能な場所であるため、スイッチの外に宣言する必要があります。 var以来

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); 
12

いくつかの代替:

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

または

/* 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 */ 
関連する問題