回答編集履歴
2
ES2020
answer
CHANGED
@@ -1,12 +1,23 @@
|
|
1
|
-
###
|
1
|
+
### 過去ログ
|
2
2
|
|
3
3
|
**宣言(Declaration)**と**定義(Definition)**の違いは3年前にES2017を元に回答したので、下記リンク先を参照して下さい。
|
4
4
|
|
5
5
|
- [宣言と定義の違いについて|teratail](https://teratail.com/questions/88915#reply-138793)
|
6
6
|
|
7
|
-
簡単にまとめると、**変数を宣言した結果、変数が定義されます**。
|
8
|
-
|
7
|
+
### ES2020
|
9
8
|
|
9
|
+
- [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)
|
10
|
+
|
11
|
+
> let and const **declarations define** variables that are scoped to the running execution context's LexicalEnvironment.
|
12
|
+
|
13
|
+
日本語訳「letおよびconst**宣言**は、実行中の実行コンテキストのLexicalEnvironmentにスコープされる変数を**定義**します。」
|
14
|
+
|
15
|
+
`Declaration` に分類される文法「`LetOrConst`」をparseした結果、変数が定義されることを表しています。
|
16
|
+
|
17
|
+
(補足)
|
18
|
+
@raccyさんはES2020のSyntax上の名前として「VariableDeclarationがない」と説明しているようですが、「宣言(Declaration)」と「定義(Definition)」はES2020上に出てくる用語です。
|
19
|
+
本質問は「変数の定義と宣言の違い」でしたので、この回答では「宣言」と「定義」の違いを中心に回答しています。
|
20
|
+
|
10
21
|
### 宣言された変数を定義する
|
11
22
|
|
12
23
|
- [13.3.2 Variable Statement - ECMAScript® 2020 Language Specification](https://262.ecma-international.org/11.0/index.html#sec-variable-statement)
|
1
変数が未定義とは
answer
CHANGED
@@ -22,4 +22,40 @@
|
|
22
22
|
3. ブラウザはparse後にコードを実行します
|
23
23
|
4. 変数 `string` が「**定義**」されます
|
24
24
|
|
25
|
+
### 変数が未定義とは
|
26
|
+
|
27
|
+
> ・変数の定義
|
28
|
+
> →変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
|
29
|
+
>
|
30
|
+
> ・変数の宣言
|
31
|
+
> →変数を用意し、あらかじめ値まで入れ込んでおく。つまり「var 変数 = 値;」のこと
|
32
|
+
|
33
|
+
変数宣言時に値指定を省略すると、暗黙の内に `undefined` 値が格納されます。
|
34
|
+
|
35
|
+
```JavaScript
|
36
|
+
var x;
|
37
|
+
console.log(x, typeof x); // undefined "undefined"
|
38
|
+
```
|
39
|
+
|
40
|
+
ただし、`undefined` 値は明示的に代入可能であり、変数宣言時に値指定が省略されたことを保証するものではありません。
|
41
|
+
|
42
|
+
```JavaScript
|
43
|
+
var y = undefined, z = void 0;
|
44
|
+
console.log(y, z); // undefined undefined
|
45
|
+
```
|
46
|
+
|
47
|
+
このように、`undefined` 値が格納された変数が**定義**されます。
|
48
|
+
|
49
|
+
---
|
50
|
+
|
51
|
+
仮にコードで `undefined` 値を代入できない仕様だったとしても「変数値が未定義」であって「変数は定義済」という解釈が正解かと思います。
|
52
|
+
「変数が未定義」とは、該当変数名で参照できない状態(`ReferenceError`)を指します。
|
53
|
+
|
54
|
+
```JavaScript
|
55
|
+
foo; // ReferenceError: foo is not defined
|
56
|
+
```
|
57
|
+
|
58
|
+
日本語訳すれば「参照エラー: foo は定義されていません」です。
|
59
|
+
逆説的には、変数参照時に**ReferenceErrorが発生しなければ、変数は定義されています**。
|
60
|
+
|
25
61
|
Re: kumasshu さん
|