回答編集履歴
2
変数の巻き上げ
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
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
|
|