回答編集履歴
3
文章をチューニング
answer
CHANGED
@@ -1,45 +1,47 @@
|
|
1
1
|
> loop内でconstはOK?
|
2
2
|
|
3
|
-
JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!
|
3
|
+
JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!…と思ったのだけど、
|
4
|
-
|
4
|
+
varとは違い、constやletはブロックスコープを作るから問題ないとのこと。
|
5
5
|
|
6
6
|
```JavaScript
|
7
|
-
for (
|
7
|
+
for (let i = 0; i < 3; i++) {
|
8
8
|
const x = i * 2;
|
9
9
|
console.log(x);
|
10
10
|
}
|
11
11
|
// 0, 2, 4 の順に出力
|
12
12
|
|
13
13
|
console.log("ended i:", i);
|
14
|
-
//
|
14
|
+
// Uncaught ReferenceError: i is not defined
|
15
15
|
|
16
16
|
console.log("ended x:", x);
|
17
17
|
// Uncaught ReferenceError: x is not defined
|
18
18
|
```
|
19
19
|
|
20
|
-
JavaScriptではfor文で定義した
|
20
|
+
JavaScriptではfor文で定義した変数はループ終了後でも平然と使えるんだけど、
|
21
|
-
|
21
|
+
letやconstを使う事でfor文の中でせき止められててイケてる挙動になったね。
|
22
22
|
|
23
|
-
varとlet・constの仕様が違うのは、
|
23
|
+
varとlet・constの仕様が違うのは、またJSお得意の継ぎ接ぎ対応かよと思わなくもないけど、
|
24
24
|
ES2015時代のコードはvarを使いませんって話なら整合性取れるしありだね。
|
25
25
|
|
26
|
-
|
26
|
+
と、ここで懸念点が出てきたので検証。
|
27
|
-
Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃない
|
27
|
+
Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないの?
|
28
|
-
|
28
|
+
下記のコードを作って[Babel公式サイトのトップ](https://babeljs.io/)に貼り付けて検証してみた。
|
29
29
|
|
30
30
|
```JavaScript
|
31
31
|
// ES2015
|
32
|
-
for (
|
32
|
+
for (let i = 0; i < 3; i++) {
|
33
33
|
const x = i *2;
|
34
34
|
console.log(x);
|
35
35
|
}
|
36
|
+
console.log(i);
|
36
37
|
console.log(x);
|
37
38
|
|
38
39
|
// Babelでコンパイル
|
39
|
-
for (var
|
40
|
+
for (var _i = 0; _i < 3; i++) {
|
40
|
-
var _x =
|
41
|
+
var _x = _i *2;
|
41
42
|
console.log(_x);
|
42
43
|
}
|
44
|
+
console.log(i);
|
43
45
|
console.log(x);
|
44
46
|
```
|
45
47
|
|
2
loop内でのconstの使用に関して考察を追記
answer
CHANGED
@@ -1,7 +1,54 @@
|
|
1
1
|
> loop内でconstはOK?
|
2
2
|
|
3
|
-
何回も呼んだら駄目に決まってるでしょ!!
|
3
|
+
JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!
|
4
|
+
…と思ったのだけど、指摘があったので考察し直し。
|
4
5
|
|
6
|
+
```JavaScript
|
7
|
+
for (var i = 0; i < 3; i++) {
|
8
|
+
const x = i * 2;
|
9
|
+
console.log(x);
|
10
|
+
}
|
11
|
+
// 0, 2, 4 の順に出力
|
12
|
+
|
13
|
+
console.log("ended i:", i);
|
14
|
+
// ended i: 3
|
15
|
+
|
16
|
+
console.log("ended x:", x);
|
17
|
+
// Uncaught ReferenceError: x is not defined
|
18
|
+
```
|
19
|
+
|
20
|
+
JavaScriptではfor文で定義したiはループ終了後でも平然と使えるから同じスコープでやってる事が確認出来るけど、
|
21
|
+
constやletは論理的なブロックスコープで区切って上手にブロックしてるのね。
|
22
|
+
|
23
|
+
varとlet・constの仕様が違うのは、個人的にはまたJSが例外の継ぎ接ぎ対応しやがったksgと大変お怒りだけど、
|
24
|
+
ES2015時代のコードはvarを使いませんって話なら整合性取れるしありだね。
|
25
|
+
|
26
|
+
…と思ったけど、懸念点が出てきた。
|
27
|
+
Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないかと思ってたので試してみた。
|
28
|
+
参考URL: [Babel公式サイトトップページ](https://babeljs.io/)
|
29
|
+
|
30
|
+
```JavaScript
|
31
|
+
// ES2015
|
32
|
+
for (var i = 0; i < 3; i++) {
|
33
|
+
const x = i *2;
|
34
|
+
console.log(x);
|
35
|
+
}
|
36
|
+
console.log(x);
|
37
|
+
|
38
|
+
// Babelでコンパイル
|
39
|
+
for (var i = 0; i < 3; i++) {
|
40
|
+
var _x = i *2;
|
41
|
+
console.log(_x);
|
42
|
+
}
|
43
|
+
console.log(x);
|
44
|
+
```
|
45
|
+
|
46
|
+
へー、外で使われると困るから存在しない変数名に変化してるんだね。
|
47
|
+
ループ後にxと_xを使うようにしたら_x2に、_x2を使ったら今度は_x3を使うように…
|
48
|
+
これなら普段から使っていく分にも大丈夫だね。賢い!
|
49
|
+
|
50
|
+
---
|
51
|
+
|
5
52
|
> `list.map((value) => { //ここでconst }`
|
6
53
|
|
7
54
|
ちっともループじゃないじゃないか!!
|
1
軽い文章修正
answer
CHANGED
@@ -21,11 +21,13 @@
|
|
21
21
|
何のための関数か、何のためのconstか全く意味分からないよね。
|
22
22
|
関数定義したのに再利用出来ないじゃんって話になるし…
|
23
23
|
|
24
|
-
|
24
|
+
上記では`foo`関数と一度定義して仕切り直してるけど、
|
25
|
-
1回しか使われない関数は無名関数としてその場で定義
|
25
|
+
1回しか使われない関数は無名関数としてその場で定義して使うというテクニックがある。
|
26
|
-
|
26
|
+
無名でも関数は関数。
|
27
27
|
|
28
|
+
Array.mapという高階関数(厳密にはプロトタイプメソッドだからちょっと違うけど)に渡された関数であって、
|
29
|
+
1回1回の実行はキチンと区切られている。
|
28
|
-
|
30
|
+
各々の要素に適用する関数は相互に影響し合うことはないから大丈夫。
|
29
31
|
|
30
32
|
---
|
31
33
|
|