質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.23%

  • JavaScript

    11826questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    5028questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

波括弧でネストする意味は?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 261

GCP

score 1

ときどき、下のコードのようにわざと波括弧でネストしているものを見かけます

{
    // 処理
}


初めてこれを発見したのはjavascriptでしたが、C#でも見ることができました。

ここで質問なのですが、

  • ズバリ、これをする意味はなんなのでしょうか?
    個人的には、これはその中で使っている変数を外から使えないようにしているのかなと考えていますが、どうなのでしょうか?
  • 言語によって意味が異なってきたりもするのでしょうか?
  • 関数を使うのではいけないのでしょうか?
    波括弧を使って一塊にしなければならないなら、関数化してしまったほうがいいんじゃないかな、と考えてしまいます。(もし波括弧でネストする意味が、変数を外から使えないようにするためなのなら)関数化すれば十分なのでは?と。

是非ご教授よろしくお願いします。

追記

簡単なコードを作成し、検証をしました。タグにあるように、javascript, C#で行いました。

javascriptでvarを使用した以外のものはすべてエラーとなります。
そのため、varを使用しないことを前提にしてしまえば「その中で使っている変数を外から使えないようにしている」というのは十分あり得ると思っていますが、どうなのでしょうか・・・?

2018/01/04、追記

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

 ブロック文 (BlockStatement)

JavaScript では {} は「ブロック」と呼ばれる構文で Statement の一種です。
if 文や for 文など、他の Statement の一部で Statement が要求される場所に使われることが多いですが、for 文の一部と受け取られがちで認知度が低いかもしれませんね。
他に、Label 文に使ったり、ブロックスコープを形成する為に使われることがあります。

 ネストする

ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?

同じ構文を入れ子にする」ことをネストすると表現します。
「ブロック文」と「文」は同じ構文ではないので、ネストとは表現しません。
ブロック文の中にブロック文が入れば、ブロック文をネストしていると表現して差し支えありませんが、

if (x === 1) {
  const y = 1;

  {
    const z = 1;
  }
}

先述の通り、if 文内のブロック文は認知されていないので、この説明で違和感を感じる人が多いかもしれません。

Syntax

IfStatement[Yield, Await, Return]:
  if(Expression[+In, ?Yield, ?Await])Statement[?Yield, ?Await, ?Return]elseStatement[?Yield, ?Await, ?Return]
  if(Expression[+In, ?Yield, ?Await])Statement[?Yield, ?Await, ?Return]

Re: GCP さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 05:09

    > 「ブロック」と呼ばれる構文で Statement の一種です。
    なるほど、この波括弧の正体はブロック文というのですね。波括弧もif文の一部だと思っていましたが、ブロック文と組み合わせていただけだったと知り驚きました。

    > 他に、Label 文に使ったり、ブロックスコープを形成する為に使われることがあります。
    ブロックスコープを形成するためにブロック文を使うのなら、varはブロックスコープを作らないため、追記した「varを使用しないこと」を前提にすることができるので、「その中で使っている変数を外から使えないようにしている」とゆう予想は間違っていなかったということですね。Label文にいたってはそもそも知りませんでしたので、これから調べようと思います。

    整理のためにごちゃごちゃと長文を書いてしまいましたが、全て解決しました。
    大変ありがとうございました。

    キャンセル

  • 2018/01/04 05:18

    もしよろしければ教えていただきたいのですが、ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?「それはネストではない」という旨のご指摘を他回答でいただいたので、どうしても気になってしまい・・・。

    厚かましいとは思いますが、どうかよろしくお願いします。

    キャンセル

  • 2018/01/04 12:08

    親記事に追記しました。

    キャンセル

+2

こんにちは。

恐らくGCPさんは、例えば、下記のようなコードの内側の{}をネストと呼んだのだと思います。見ることが少なめな記述と思いますが、時々見かけますね。私は適切な呼び方と思います。

void foo()
{
  {
    // 処理
  }
}

内側の {} 内で定義したローカル変数は、その外側のブロックではアクセスできません。
これにより、そのローカル変数のスコープ(有効範囲)を限定できるため、可読性が上がり、かつ、バグを作りにくくなります。
そして、内側のブロックは外側のブロックのローカル変数にアクセスできます。関数にするとこれができず、一々パラメータで渡さないと行けないため、関数化した方が良い場合とそうでもない場合の両方があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

下のコードのようにわざと波括弧でネストしているものを見かけます 

例示のコードは別にネストはされてませんが…

if (条件) 
{
    if (条件)
    {

    }
}

ネストとは↑のような状態

個人的には、これはその中で使っている変数を外から使えないようにしているのかな

簡単なコードを書いて確かめればいいと思います。

var a = 0;

if (a == 0) {
  var b = 1; 
  if (b > 0) {
    var c = a + b;
  }
}

console.log(c);

変数が使えないのであれば、このコードはエラーになるはず。
どうなるかは御自分で試してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 04:44

    ご回答ありがとうございます。

    > 例示のコードは別にネストはされてませんが…
    ご指摘ありがとうございます。もしネストされていないとすれば、質問文やタイトルを編集しなければならないのですが、適切な用語に見当がつかないので、適切な用語を教えていただけないでしょうか?

    > 簡単なコードを書いて確かめればいいと思います。
    仰る通りです・・・。。

    ※この下からは質問文にも追記します
    タグにあるように、javascript, C#で検証を行いました。
    - javascript
    var: https://paiza.io/projects/LidyZurxUiK4zYEkpF2tTQ
    let: https://paiza.io/projects/momiZ9Qtpm2jnwIIuOUfBQ

    - c#
    https://paiza.io/projects/an8DRCTx6z0uYU9eIvVpig

    javascriptでvarを使用した以外のものはすべてエラーとなります。そのため、varを使用しないことを前提にしてしまえば「その中で使っている変数を外から使えないようにしている」というのは十分あり得ると思っています。

    キャンセル

  • 2018/01/04 07:34

    > 適切な用語を教えていただけないでしょうか?

    「波括弧で囲む」でしょうか。
    二重以上にならないと「ネスト」とは言いません。

    キャンセル

0

波カッコ内はスコープが変わります。
例えばこんなことができます。

process.stdin.resume();
process.stdin.setEncoding('utf8');

{
    let str = "hello";
    console.log(str); // hello 
}

let str = "!!";
{
    let str = "world!";
    console.log(str); // world!
}
console.log(str); // !!

コピペで変数がかぶるときに使うことができますが、関数を使えって話になります。
一体どんな時に使うんでしょうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 10:47

    あいまいな記憶ですが、C#においてリファクタリングで一度インラインに展開して、関数を切りなおすときに私は使ったような気もします。

    キャンセル

0

ブロック文の中に文を入れることを「ネストする」というのは不適切でしょうか?

ブロックスコープをネストするって言ってもいいと思いますよ。
ただネストすんなとは思いますけどね。

関数を使うのではいけないのでしょうか?

「1度しか使わない場合関数を書かなくて良い」と思うのが僕の答えです。

以下関数を使わない理由です。

  • 1度しか使わない関数ならブロックスコープで代替した方が読みやすい
  • 1度しか使わない関数の名前を考えるのは無駄なコストである
  • 1度しか使わない関数なら外に書く場合スコープが汚染される、中なら呼び出し行が増えて可読性を損なう
  • トランザクションスクリプトは大体エントリポイントが1つなので長くても関数1つで良い
    ※手続き的な関数のこと、例えば画面の仕様に合わせて同系の処理が只管並ぶこと

ブロックスコープを使わなくても上手く仕組み作って1ブロックスコープ=1関数呼び出しにせめてできるだろ、って思う場合もありますが、やっつけの仕事で全部で1画面とかしかない場合だとか、ライブラリのコードサイズが気になる場合含め諸々導入する方が面倒だったりもするので、そういう場合はブロックスコープでもいいかなと。それでも全く使わないよりは変数のスコープ制限した方が良いと思いますしね。

まあ…ブロックスコープ内は大体お決まりのコーディングになるので、数が多くなれば関数作った方がそれでもいいですけどね。jsonのプロパティの指定は簡単にできるわけだし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • JavaScript

    11826questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • C#

    5028questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。