過去ログ
**宣言(Declaration)と定義(Definition)**の違いは3年前にES2017を元に回答したので、下記リンク先を参照して下さい。
ES2020
let and const declarations define variables that are scoped to the running execution context's LexicalEnvironment.
日本語訳「letおよびconst宣言は、実行中の実行コンテキストのLexicalEnvironmentにスコープされる変数を定義します。」
Declaration
に分類される文法「LetOrConst
」をparseした結果、変数が定義されることを表しています。
(補足)
@raccyさんはES2020のSyntax上の名前として「VariableDeclarationがない」と説明しているようですが、「宣言(Declaration)」と「定義(Definition)」はES2020上に出てくる用語です。
本質問は「変数の定義と宣言の違い」でしたので、この回答では「宣言」と「定義」の違いを中心に回答しています。
宣言された変数を定義する
JavaScript
1var string = 'Hello, World!'; // VariableStatement(変数文)
上記コードは次の流れで実行されます。
- コーダーは構文「VariableStatement」をコーディングすることで変数を「宣言」します
- ブラウザは構文「VariableStatement」をparse(解析)します
- ブラウザはparse後にコードを実行します
- 変数
string
が「定義」されます
変数が未定義とは
・変数の定義
→変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
・変数の宣言
→変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
変数宣言時に値指定を省略すると、暗黙の内に undefined
値が格納されます。
JavaScript
1var x;
2console.log(x, typeof x); // undefined "undefined"
ただし、undefined
値は明示的に代入可能であり、変数宣言時に値指定が省略されたことを保証するものではありません。
JavaScript
1var y = undefined, z = void 0;
2console.log(y, z); // undefined undefined
このように、undefined
値が格納された変数が定義されます。
仮にコードで undefined
値を代入できない仕様だったとしても「変数値が未定義」であって「変数は定義済」という解釈が正解かと思います。
「変数が未定義」とは、該当変数名で参照できない状態(ReferenceError
)を指します。
JavaScript
1foo; // ReferenceError: foo is not defined
日本語訳すれば「参照エラー: foo は定義されていません」です。
逆説的には、変数参照時にReferenceErrorが発生しなければ、変数は定義されています。
Re: kumasshu さん