回答編集履歴

2

変数の巻き上げ

2019/08/14 09:39

投稿

think49
think49

スコア18189

test CHANGED
@@ -118,4 +118,104 @@
118
118
 
119
119
 
120
120
 
121
+ ### 変数の巻き上げ(Variable hoisting)
122
+
123
+
124
+
125
+ JavaScript では変数の「初期化」と「代入」は分けて実行されます。
126
+
127
+
128
+
129
+ - 変数は**関数呼び出し時**に生成されます
130
+
131
+ - 関数呼び出し直後に、関数内で宣言された**全ての変数を undefined で初期化+*します
132
+
133
+ - `var a = 1;` が実行された時、1 が**代入**されます(初期化は既に完了しています)
134
+
135
+
136
+
137
+
138
+
139
+ ```JavaSctipt
140
+
141
+ function sample1 () { // 変数 a が undefined で「初期化」される
142
+
143
+ console.log(a); // undefined
144
+
145
+
146
+
147
+ var a = 1; // 1 が「代入」される
148
+
149
+ }
150
+
151
+
152
+
153
+ sample1();
154
+
155
+ ```
156
+
157
+
158
+
159
+ この挙動は分かりづらい為、あえて初期化と代入を分けてコートを書く事を好む人もいます。
160
+
161
+
162
+
163
+ ```JavaSctipt
164
+
165
+ function sample2 () { // 変数 a が undefined で「初期化」される
166
+
167
+ var a; // 初期化済なので何もしないが、このコードはundefined で初期化を意図している為、分かりやすい
168
+
169
+
170
+
171
+ console.log(a); // undefined
172
+
173
+ a = 1; // 1 が「代入」される
174
+
175
+ }
176
+
177
+
178
+
179
+ sample2();
180
+
181
+ ```
182
+
183
+
184
+
185
+ for 文の挙動は下記になります。
186
+
187
+
188
+
189
+ ```JavaSctipt
190
+
191
+ function sample3 () { // 変数 elememts,i,len が undefined で「初期化」される
192
+
193
+
194
+
195
+ var elememts = document.querySelectorAll('.plus'); // NodeListが「代入」される(3つの要素を持つとする)
196
+
197
+
198
+
199
+ for (var i = 0, len = elememts.length; i < len; i++) { // i, len が代入される(3回繰り返し)
200
+
201
+ elements.addEventListener('click', () => console.log(i), false); // clickリスナー実行時にはループ処理が終わっている為、i 値は常に3となる
202
+
203
+ }
204
+
205
+ }
206
+
207
+
208
+
209
+ sample3();
210
+
211
+ ```
212
+
213
+
214
+
215
+ ところで、`let`, `const` でも巻き上げは発生しています。
216
+
217
+ ただし、変数定義文より前に変数参照が行われると、`ReferenceError` で停止する為、事実上、巻き上げを考慮する必要がなくなっています。
218
+
219
+
220
+
121
221
  Re: YESYUKI17 さん

1

ECMAScript 6 compatibility table

2019/08/14 09:39

投稿

think49
think49

スコア18189

test CHANGED
@@ -11,6 +11,8 @@
11
11
 
12
12
 
13
13
  - [for + let - JSFiddle](https://jsfiddle.net/7gyn2kpa/)
14
+
15
+ - [for/for-in loop iteration scope - ECMAScript 6 compatibility table](http://kangax.github.io/compat-table/es6/#test-let_for/for-in_loop_iteration_scope)
14
16
 
15
17
 
16
18