teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

訂正

2020/02/14 07:16

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア37495

answer CHANGED
@@ -65,7 +65,7 @@
65
65
  そこで、その外側のスコープ、Aの中で探したところ、定義文が見つかりました。
66
66
  スコープC、Dの定義は閉じ込められているので、外側から参照できません。
67
67
  なので、(3)の変数`x`は、スコープAで定義されている変数だ、とJavaScriptは判断し、その値`0`に`1`を足します。
68
- つまり、ここでの変数`x`は`0`です。
68
+ つまり、ここでの変数`x`は`1`です。
69
69
 
70
70
  (4)で変数`x`を参照していますが、やはりここでJavaScriptは変数`x`を探しに行きます。
71
71
  まず、参照しているスコープ、Dの中で探したところ、定義文が見つかりませんでした。

1

補完

2020/02/14 07:16

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア37495

answer CHANGED
@@ -1,6 +1,9 @@
1
1
  ※これからする説明は分かりやすさを優先しているため、実際の仕様や実装と異なる部分があると思いますので、ご了解ください。あと、ホイスティングは悪い文明です。
2
2
 
3
+ ---
4
+
5
+ JavaScript では、**定義されたスコープ**に変数が閉じ込められ、外側に影響することはできません。
3
- JavaScript では、変数を参照する際に、スコープを内側から順番に探してきます。
6
+ そして、変数を参照する際に、スコープを内側から順番に探してきます。
4
7
   
5
8
  ```js
6
9
  { // A
@@ -60,6 +63,7 @@
60
63
  (3)で変数`x`を参照していますが、やはりここでJavaScriptは変数`x`を探しに行きます。
61
64
  まず、参照しているスコープ、Bの中で探したところ、定義文が見つかりませんでした。
62
65
  そこで、その外側のスコープ、Aの中で探したところ、定義文が見つかりました。
66
+ スコープC、Dの定義は閉じ込められているので、外側から参照できません。
63
67
  なので、(3)の変数`x`は、スコープAで定義されている変数だ、とJavaScriptは判断し、その値`0`に`1`を足します。
64
68
  つまり、ここでの変数`x`は`0`です。
65
69
 
@@ -71,17 +75,20 @@
71
75
 
72
76
  (5)で変数`x`を参照していますが、やはりここでJavaScriptは変数`x`を探しに行きます。
73
77
  まず、参照しているスコープ、Cの中で探したところ、定義文が見つかりました。
78
+ スコープDの定義は閉じ込められているので、外側から参照できません。
74
79
  なので、(5)の変数`x`は、スコープCで定義されている変数だ、とJavaScriptは判断し、その値`11`に`1`を足します。
75
80
  つまり、ここでの変数`x`は`12`です。
76
81
 
77
82
  (6)で変数`x`を参照していますが、やはりここでJavaScriptは変数`x`を探しに行きます。
78
83
  まず、参照しているスコープ、Bの中で探したところ、定義文が見つかりませんでした。
79
84
  そこで、その外側のスコープ、Aの中で探したところ、定義文が見つかりました。
85
+ スコープC、Dの定義は閉じ込められているので、外側から参照できません。
80
86
  なので、(6)の変数`x`は、スコープAで定義されている変数だ、とJavaScriptは判断し、その値`1`に`1`を足します。
81
87
  つまり、ここでの変数`x`は`2`です。
82
88
 
83
89
  (7)で変数`x`を参照していますが、やはりここでJavaScriptは変数`x`を探しに行きます。
84
90
  まず、参照しているスコープ、Aの中で探したところ、定義文が見つかりました。
91
+ スコープB、C、Dの定義は閉じ込められているので、外側から参照できません。
85
92
  なので、(7)の変数`x`は、スコープAで定義されている変数だ、とJavaScriptは判断し、その値`2`に`1`を足します。
86
93
  つまり、ここでの変数`x`は`3`です。
87
94