JavaScript にはブロック スコープがないことを読んで、自分の経験から発見しました。言語がこのように設計された理由があると仮定すると、その理由を説明できますか?
私はGoogleとここを見回しましたが、私が見つけた投稿は、理由を説明せずに、JSには関数スコープがあり、ブロックスコープではないことを繰り返しています。なぜこれが実際に当てはまるのか知りたいです。
JavaScript にはブロック スコープがないことを読んで、自分の経験から発見しました。言語がこのように設計された理由があると仮定すると、その理由を説明できますか?
私はGoogleとここを見回しましたが、私が見つけた投稿は、理由を説明せずに、JSには関数スコープがあり、ブロックスコープではないことを繰り返しています。なぜこれが実際に当てはまるのか知りたいです。
コメントを回答に変換する
作成者の選択: ブレンダンにツイートしたところ、次の回答が得られました。
@mplungjan 10 日間は、ブロック スコープの時間がありませんでした。また、その 90 年代半ばの時代の多くの「スクリプト言語」は、スコープがほとんどなく、後でさらに成長しました。
とはいえ、ここにいくつかの関連するポイントがあります。
重要: ECMAScript2015 (第 6 版) より前の JavaScript には、ブロック スコープがありません。ブロック内に導入された変数は、それを含む関数またはスクリプトにスコープされ、それらを設定した効果はブロック自体を超えて持続します。つまり、ブロック ステートメントはスコープを導入しません。「スタンドアロン」ブロックは有効な構文ですが、JavaScript ではスタンドアロン ブロックを使用したくありません。なぜなら、C や Java でそのようなブロックのようなことをすると思っていても、あなたが思っていることをしないからです。
新しい関数を作成してすぐに呼び出すことで、人為的にスコープを導入できます
let
宣言さconst
れた変数は巻き上げられますが、同じように初期化されません。したがって、値が割り当てられる前にまたは宣言された変数を参照すると、ReferenceError が発生します。undefined
var
let
const
同じブロック スコープで同じ変数を再宣言すると、SyntaxError が発生します。
多くの理由がありますが、オブジェクト リテラル (ブロックのように見えることもあります) を使用するコードの解析/デバッグを支援するため、およびローカル変数のガベージ コレクションを簡素化するために思い浮かぶものがあります。
約束されたサポート (たとえばhttp://esdiscuss.org/notes/2012-07-25で説明されています) が現実のものになることを願っていますi
。シングルループ。