回答編集履歴

2

ES2020

2021/01/19 14:29

投稿

think49
think49

スコア18189

test CHANGED
@@ -1,4 +1,4 @@
1
- ### 宣言と定義
1
+ ### 過去ログ
2
2
 
3
3
 
4
4
 
@@ -10,9 +10,31 @@
10
10
 
11
11
 
12
12
 
13
- 簡単にまとめると、**変数を宣言した結果、変数が定義されます**。
13
+ ### ES2020
14
14
 
15
+
16
+
17
+ - [13.3.1 Let and Const Declarations - ECMAScript® 2020 Language Specification](https://262.ecma-international.org/11.0/index.html#sec-let-and-const-declarations)
18
+
19
+
20
+
21
+ > let and const **declarations define** variables that are scoped to the running execution context's LexicalEnvironment.
22
+
23
+
24
+
25
+ 日本語訳「letおよびconst**宣言**は、実行中の実行コンテキストのLexicalEnvironmentにスコープされる変数を**定義**します。」
26
+
27
+
28
+
29
+ `Declaration` に分類される文法「`LetOrConst`」をparseした結果、変数が定義されることを表しています。
30
+
31
+
32
+
33
+ (補足)
34
+
35
+ @raccyさんはES2020のSyntax上の名前として「VariableDeclarationがない」と説明しているようですが、「宣言(Declaration)」と「定義(Definition)」はES2020上に出てくる用語です。
36
+
15
- 宣言は「経過定義は「結果す。
37
+ 本質問は「変数の定義と宣言の違い」でしたので、この回答では「宣言と「定義」の違いを中心に回答しています。
16
38
 
17
39
 
18
40
 

1

変数が未定義とは

2021/01/19 14:29

投稿

think49
think49

スコア18189

test CHANGED
@@ -46,4 +46,76 @@
46
46
 
47
47
 
48
48
 
49
+ ### 変数が未定義とは
50
+
51
+
52
+
53
+ > ・変数の定義
54
+
55
+ > →変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
56
+
57
+ >
58
+
59
+ > ・変数の宣言
60
+
61
+ > →変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
62
+
63
+
64
+
65
+ 変数宣言時に値指定を省略すると、暗黙の内に `undefined` 値が格納されます。
66
+
67
+
68
+
69
+ ```JavaScript
70
+
71
+ var x;
72
+
73
+ console.log(x, typeof x); // undefined "undefined"
74
+
75
+ ```
76
+
77
+
78
+
79
+ ただし、`undefined` 値は明示的に代入可能であり、変数宣言時に値指定が省略されたことを保証するものではありません。
80
+
81
+
82
+
83
+ ```JavaScript
84
+
85
+ var y = undefined, z = void 0;
86
+
87
+ console.log(y, z); // undefined undefined
88
+
89
+ ```
90
+
91
+
92
+
93
+ このように、`undefined` 値が格納された変数が**定義**されます。
94
+
95
+
96
+
97
+ ---
98
+
99
+
100
+
101
+ 仮にコードで `undefined` 値を代入できない仕様だったとしても「変数値が未定義」であって「変数は定義済」という解釈が正解かと思います。
102
+
103
+ 「変数が未定義」とは、該当変数名で参照できない状態(`ReferenceError`)を指します。
104
+
105
+
106
+
107
+ ```JavaScript
108
+
109
+ foo; // ReferenceError: foo is not defined
110
+
111
+ ```
112
+
113
+
114
+
115
+ 日本語訳すれば「参照エラー: foo は定義されていません」です。
116
+
117
+ 逆説的には、変数参照時に**ReferenceErrorが発生しなければ、変数は定義されています**。
118
+
119
+
120
+
49
121
  Re: kumasshu さん