switchのcase句の中に{}がある

このQ&Aのポイント
  • switchのcase句の中に{}がある意味が分からない。
  • 初心者ですが、よろしくお願いします。
回答を見る
  • ベストアンサー

switchのcase句の中に{}がある

今下のコードを読んでいるのですが、case句の中に{}がある意味が分かりません。 switch (d3.event.keyCode) { case 8: // backspace case 46: { // delete  ←ここです。 var i = self.points.indexOf(self.selected); self.points.splice(i, 1); self.selected = self.points.length ? self.points[i > 0 ? i - 1 : 0] : null; self.update(); break; } } 初心者ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

そこで使われているのはただ単に見やすくするだけ(複数行がcaseで始まってbreakで終わるのはわかりにくいため)のためです。 もちろんブロックスコープをこさえるために使うことも多々ありますが、その場合は変数宣言をvarではなくletやconstで行わなければなりません。 もしかするとあまりJSに詳しくない人がブロックスコープを作る気で書いたのかもしれませんが、前述の通りvarでは効果を発揮しません。

natyo4235
質問者

お礼

回答ありがとうございます。 letを使っていなくてもコード自体に問題ないので、とりあえず何かわかってよかったです。ありがとうございました。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.1

{}内で定義した変数は、ローカルスコープを持ち、{}の外の同名の変数に影響を与えません。 なので、{}の中で var i = ~~~ と変数を定義して使っても、{}の外に影響を与えません。 {}で括る目的は「{}の中でローカル変数iを定義して使う際に、{}の外にある変数iに影響を与えたくないため」です。 以下のようになっている場合を考えて見て下さい。 var i = hogehoge;  ←switch文の前で i が定義されている (略) switch (d3.event.keyCode) { case 8: // backspace case 46: { // delete var i = self.points.indexOf(self.selected);  ← {}の中で定義された i (略) } } (略) if (i == hogehoge) {  ←ここの i は、どの i だろう? (略) }

natyo4235
質問者

お礼

回答ありがとうございました。 これはブロックスコープというやつですか?javascriptにはブロックスコープがないと勘違いしてたみたいです。オブジェクト以外に単独で使用するものだと思ってませんでしたorz <if (i == hogehoge) {  ←ここの i は、どの i だろう? グローバルです!

関連するQ&A

  • case で宣言コンパイルエラー

     switch (msg){  case WM_LBUTTONDOWN:   char *p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; がエラーで  switch (msg){  case WM_LBUTTONDOWN:   char *p;   p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; と  switch (msg){  case WM_KEYDOWN:   if( wParam == VK_RETURN ){    char *p = new char[1000];    wsprintf(p, "%d" , i);    MessageBox(hWnd , p , "" , MB_OK);    delete[] p;   }  break; ならエラーじゃなかったんだけど、理由がよく分かりません。 case のすぐ下で宣言と同時に値を代入してはいけないんですか?

  • 数値以外の入力をさせないようにした後・・・

    いつもお世話になっています。 ****************************************************************** <htm> <head> <script language=javascript> <!-- function checkNum() { c=String.fromCharCode(event.keyCode); if("0123456789".indexOf(c,0)<0)return false; return true; } //--> </script> </head> <body> <form> <input type="text" onKeyDown="return checkNum()"> <input type="submit"> </form> </body> </htm> ****************************************************************** 以上のソースでテキストボックス内に数値以外入力できないようにしました。 が、こうすると入力した値を消そうとしてもBackSpace・Deleteキーが使えないのです。 どうしたら入力制限をかけつつ、両キーを有効にできるのでしょうか。

  • プロセッシングが出来ません。

    プロセッシングをしていて、ずっと「java.lang.NullPointerException」が出ています。 ですが、どこで起きているのかわかりません。 わかる人いたら教えてください。 String sc_data[]; int sc[][] = new int[sc_data.length][4]; void setup() { int dow, i; frameRate(1); size(480,640); sc_data = loadStrings("schedule.txt"); System.out.println(sc_data.length); for(i = 0; i < sc_data.length; i++){ sc[i] =int( sc_data[i].split(",")); println(sc[i]); } } int idx,k; int mo,d,h,m,s; int c_w = 60; float b_c,he,y; void set_color(int idx){ switch(idx){ case 1: fill(77,166,255,100); break; case 2: fill(128,255,0,100); break; case 3: fill(245,112,112,100); break; case 4: fill(117,125,198); break; case 5: fill(151,247,242); break; case 6: fill(255,214,70); break; case 7: fill(147,38,255); break; case 8: fill(2,214,70); break; case 9: fill(253,198,230); break; } } void make_sc(float y, int s[][], float t,int o){ int l; fill(255,255,255,100); rect(0,70,c_w,height); y = s[o][0]*25 + s[o][1]*5/12; t = s[o][2]*5/12; println(t); l = s[o][3] + 3; set_color(l); rect(0, y, c_w,t); } void barclock(float b){ b = h*25+m*5/12; //println(b); noStroke(); if ((b >= 0)&&(b < 150)){ set_color(1); } else if ((b >= 150)&&(b < 225)){ set_color(2); } else if ((b >= 225)&&(b < 450)){ set_color(3); } else { set_color(4); } rect(0,0,width,b); fill(0); textSize(15); text(+mo+" / "+d+" "+h+":"+m+":"+s,5,49); } void draw() { mo= month(); d = day(); h = hour(); m = minute(); s = second(); background(255); strokeWeight(1); barclock(b_c); for(int i = 0; i < sc_data.length; i++){ make_sc(y, sc, he,i); } }

  • 検索フォームでの結果を別窓にあるフレームに表示する方法を教えて下さい

    ホームページにプルダウン式の検索フォームを作っているのですが、検索結果を思うように表示することができなくて困っています。 検索フォームはindex.htmlに設置してあります。 kensaku.htmlというファイル(上下にフレーム分割してある)の下(nameはbottom)のフレームに検索結果を表示させたいと思っています。 どのように書いたらいいのか教えてください。 どうぞよろしくお願いします。 現在は普通の別窓での表示するになっています。 ↓↓↓↓↓ ////////// HOMEPAGEを開く function openHome(selected){ window.open(getHomeURL(selected),'h'+selected,"location=1,menubar=1,toolbar=1,status=1,scrollbars=1,resizable=1"); } function getHomeURL(selected){ return 'http://' + Engine_Info[selected].home; } ////////// 検索結果を開く function openSearchURL(selected,keyword){ switch ( navigator.appName.charAt(0) ){ case 'N': if ( !navigator.userAgent.indexOf("Gecho") ){ keyword = escape(keyword); } break; default: break; } window.open(getSearchURL(selected,keyword),'s'+selected,"location=1,menubar=1,toolbar=1,status=1,scrollbars=1,resizable=1") } function getSearchURL(selected,keyword){ if ( Engine_Info[selected].option != '' ){ return 'http://' + Engine_Info[selected].engine + '?' + Engine_Info[selected].option + '&' + Engine_Info[selected].key + '=' + keyword; } else { return 'http://' + Engine_Info[selected].engine + '?' + Engine_Info[selected].key + '=' + keyword; } }

  • C++のファイルの読み込みの部分で質問があります。

    fp = fopen("enemydata.csv","r");の部分のコードで "enemydata.csv"のファイルを読み込むのですが "r"の部分が何を意味しているのがわかりません。 以下のコードの他にも enemy.cpp enemy.h がありますが関連するものが見あたりません。 "r"の部分のコードは以下に表示します。 よろしくお願いします。 control.cpp #include "pch.h" #include "control.h" CONTROL::CONTROL() { player = new PLAYER; back = new BACK; FILE *fp; ENEMYDATA data[ENEMY_NUM]; char buf[100]; int c; int col=1; int row=0; memset(buf,0,sizeof(buf)); ここの部分→fp = fopen("enemydata.csv","r"); //ヘッダ読み飛ばし while(fgetc(fp)!='\n'); while(1){ while(1){ c=fgetc(fp); //末尾ならループを抜ける。 if(c==EOF) goto out; //カンマか改行でなければ、文字としてつなげる if(c!=','&& c!='\n') strcat(buf,(const char*)&c); //カンマか改行ならループ抜ける。 else break; } //ここにきたということは、1セル分の文字列が出来上がったということ switch(col){ //1列目は敵種類を表す。atoi関数で数値として代入。 case 1: data[row].type=atoi(buf); break; //2列目は弾種類。以降省略。 case 2: data[row].stype=atoi(buf); break; case 3: data[row].m_pattern=atoi(buf); break; case 4: data[row].s_pattern=atoi(buf); break; case 5: data[row].in_time=atoi(buf); break; case 6: data[row].stop_time=atoi(buf); break; case 7: data[row].shot_time=atoi(buf); break; case 8: data[row].out_time=atoi(buf); break; case 9: data[row].x=atoi(buf); break; case 10: data[row].y=atoi(buf); break; case 11: data[row].speed=atoi(buf); break; case 12: data[row].hp=atoi(buf); break; case 13: data[row].item=atoi(buf); break; } //バッファを初期化 memset(buf,0,sizeof(buf)); //列数を足す ++col; //もし読み込んだ文字が改行だったら列数を初期化して行数を増やす if(c=='\n'){ col=1; ++row; } } out: //敵クラス生成 for(int i=0;i<ENEMY_NUM;++i){ enemy[i]=new ENEMY( data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time, data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item); } } void CONTROL::All() { //int count = 0; //描画領域を指定 SetDrawArea(MARGIN,MARGIN,MARGIN+380,MARGIN+460); back->All(); //プレイヤークラスのAll関数実行 player->All(); for(int i=0;i<ENEMY_NUM;++i){ if(enemy[i]!=NULL){ if(enemy[i]->All()){ delete enemy[i]; enemy[i]=NULL; } } } ++g_count; } CONTROL::~CONTROL() { //プレイヤークラスの解放 delete player; delete back; for(int i=0;i<ENEMY_NUM;++i){ if(enemy[i]!=NULL){ delete enemy[i]; } } }

  • createEmptyMoviClipをつかって画像とリンクを設定したい

    createEmptyMovieclipなどを使って、各ムービークリップに画像とリンク設定(getURL)をしたいと思っていますが、初心者なのもので、うまく設定できず困っております。 (その1):下記のコードでは、画像表示は計算通り表示されますが、リンク設定はできないでおります。 ※下記switch文の「case2」は無視していただいても構いません。 ------------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; load_obj = new MovieClipLoader(); act_step = 0; this.onEnterFrame = function(){ var i , clip ; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ clip = this.createEmptyMovieClip("clip" + i ,i); load_obj.loadClip(file_list[i] , clip); } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ----------------------------------------------------------------------------------------- (その2)上記コード(その1)でリンク設定ができなかったので、下記のコードのように 「createEmptyMovieClip」を使って、画像表示とリンク設定をしたかったですが、これもうまくいきませんでした。 ---------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; act_step = 0; this.onEnterFrame = function(){ var i , clip , rinku; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ this.createEmptyMovieClip("rinku"+i,i); this.rinku.createEmptyMovieClip("clip" + i ,i); this.rinku.clip.loadMovie(file_list[i] , i); this.rinku.onPress = function(){ getURL(link[i] ,"_self"); } } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ------------------------------------------------------------------- 上記「その1」または「その2」を修正して、リンクの設定を行う方法をご教示お願いいたします!

    • ベストアンサー
    • Flash
  • tableタグの中にあるinputタグに最初から格納させる方法

    (1)index.htmlの記述の中に、たとえば <a href="form.html?/info_mail@ff5.ocn8.ne.jp">自動返信テスト</a>と書きます。 (2)このリンクをクリックしてform.htmlを表示します。 このページのtableタグの中にあるinputタグに最初から格納させる方法 をご教授いただけないでしょうか? form.htmlのソースは、 <html> <head> <title>登録</title> <script language="JavaScript"> <!-- var STR = location.href; var STR1 = STR.split("?"); if (STR1.length > 1){ var STR2 = STR1[1].split("/"); STR2.shift(); for (i in STR2){ switch ( STR2[i] ) { case "": break; case "": break; case "": break; default: break; } document.getElementById("eml").value=STR2[i]; } } //--> </script> </head> <body> <font color="#f35e3c">登録</font><br> <form action="./cgi-bin/testhogehoge2008.cgi" method="post"> アドレス<br> <input name="email" type="text" size="20" maxlength="50" id="eml" /> <input name="email" type="hidden" size="20" maxlength="50" id="eml" /><br> <input type=submit value="確認"> </form> </body> </html> です。 まったくわかりません。困っています。 よろしくお願いいたします。

  • 現在学校のjavaの課題電卓を作っています

    import java.io.*; class dentaku { public static void main(String[] args)throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); System.out.print("式を入力"); String input = r.readLine(); String sum[] = new String[input.length()]; String number = ""; int s = 0; int goukei =0; char enzan = ' '; for(int i=0; i < input.length(); i++) { //System.out.print(str[i]); //文字列から1文字ずつ抽出 char num = input.charAt(i); if(i == input.length()-1) { sum[s] = number; } else { if(num == '+' || num == '-'|| num == '*'|| num == '/') { //配列sumに代入 sum[s] = number; s++; sum[s] = String.valueOf(num); s++; } else { //変数numberにnumを代入 number = number + num; } } } for(int j=0; j<sum.length; j++) { if(sum[j] == null) { break; } if(j == 0) { goukei = Integer.parseInt(sum[j]); } else { if(sum[j].equals("+") || sum[j].equals("-")|| sum[j].equals("*")|| sum[j].equals("/")) { enzan = sum[j].charAt(0); } else { switch(enzan) { case '+': goukei += Integer.parseInt(sum[j]); break; case '-': goukei -= Integer.parseInt(sum[j]); break; case '*': goukei *= Integer.parseInt(sum[j]); break; case '/': goukei /= Integer.parseInt(sum[j]); break; } } } } System.out.print(goukei); } } までできたのですが 実行し 実際に 1+1+1とうってみると答えが23になってしまいます。 どのようにしたらいいのでしょうか

    • ベストアンサー
    • Java
  • Javaでクイズ作成途中もエラー

    あの、以前こちらで質問した者です。→http://okwave.jp/qa/q6482901.html 今、英単語が表示され日本語でそれを答えるクイズを作ろうとしています。 まだまだ作りかけですが、どうしてもコンパイル時にエラーになってしまいます。 どこから直せば良さそうですか?自己研究ということで周りに質問する人がいません。 すみませんがヒントを頂けたらと質問しました。よろしくお願いします。 import java.io.*; public class EnglishToJapaneseQuiz { public int MAX_QUESTION = 5; public int GOODANSWER = 0; public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("Welcome! This quiz helps you study Japanese in English"); System.out.println("'n' normal"); System.out.println("'h' hard"); System.out.println("'e' expert"); System.out.println("'z' exit"); System.out.println("Please select the level"); String line = reader.readLine(); char c = line.charAt(0); switch (c) { case 'n': System.out.println("You selected normal"); for (int i=0; i<MAX_QUESTION; i++) { int x = (int)(Math.random() * 10) + 1; switch (x) { case 1: System.out.println("School"); String Answer = "学校"; BufferedReader responce = new BufferedReader(new InputStreamReader(System.in)); String line = responce.readLine(); If (line.equals(Answer)) { System.out.println("correct"); GOODANSWER = GOODANSWER + 1; } else { System.out.println("incorrect"); } break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: } } break; case 'h': System.out.println("You selected hard"); break; case 'e': System.out.println("You selected expert"); break; case 'z': break; default: System.out.println("you must indicate valid character"); break; } } catch (IOException e) { System.out.println(e); System.out.println("invalid value"); } System.out.println("the program was successfully ended"); } }

    • ベストアンサー
    • Java
  • WHERE句の中でCASE句

    区分が1の時にステータス0,1,2のもの、区分が1以外の場合はステータス0,1のものを抽出、というSQLを書きたいのですが、 WHERE句の中に (CASE Kbn WHEN '1' THEN Status in('0','1','2') ELSE Status in('0','1') END) とするとエラーとなりました。 このような場合、WHERE句の中にCASE句で実現は不可能でしょうか? 一応以下のようにすれば期待通りの内容が抽出できるのですが、美しくないなあと。 ((Kbn = '1' AND Status in('0','1','2')) OR (Kbn != '1' AND Status in('0','1'))) 何か他にいい手がありますでしょうか。

専門家に質問してみよう