72

JavaScript にはブロック スコープがないことを読んで、自分の経験から発見しました。言語がこのように設計された理由があると仮定すると、その理由を説明できますか?

私はGoogleとここを見回しましたが、私が見つけた投稿は、理由を説明せずに、JSには関数スコープがあり、ブロックスコープではないことを繰り返しています。なぜこれが実際に当てはまるのか知りたいです。

4

4 に答える 4

114

コメントを回答に変換する

作成者の選択: ブレンダンにツイートしたところ、次の回答が得られました。

@mplungjan 10 日間は、ブロック スコープの時間がありませんでした。また、その 90 年代半ばの時代の多くの「スクリプト言語」は、スコープがほとんどなく、後でさらに成長しました。


とはいえ、ここにいくつかの関連するポイントがあります。

重要: ECMAScript2015 (第 6 版) より前の JavaScript には、ブロック スコープがありません。ブロック内に導入された変数は、それを含む関数またはスクリプトにスコープされ、それらを設定した効果はブロック自体を超えて持続します。つまり、ブロック ステートメントはスコープを導入しません。「スタンドアロン」ブロックは有効な構文ですが、JavaScript ではスタンドアロン ブロックを使用したくありません。なぜなら、C や Java でそのようなブロックのようなことをすると思っていても、あなたが思っていることをしないからです。

新しい関数を作成してすぐに呼び出すことで、人為的にスコープを導入できます

let宣言さconstれた変数は巻き上げられますが、同じように初期化されません。したがって、値が割り当てられる前にまたは宣言された変数を参照すると、ReferenceError が発生します。undefinedvarletconst

同じブロック スコープで同じ変数を再宣言すると、SyntaxError が発生します。

于 2013-06-26T05:12:00.503 に答える
0

多くの理由がありますが、オブジェクト リテラル (ブロックのように見えることもあります) を使用するコードの解析/デバッグを支援するため、およびローカル変数のガベージ コレクションを簡素化するために思い浮かぶものがあります。

約束されたサポート (たとえばhttp://esdiscuss.org/notes/2012-07-25で説明されています) が現実のものになることを願っていますi。シングルループ。

于 2013-06-26T04:50:14.013 に答える