回答編集履歴

3

文章をチューニング

2017/08/26 05:14

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!
5
+ JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!…と思ったのだけど、
6
6
 
7
- 思ったのだけど指摘があったで考察し直し
7
+ varは違いconstやletはブロックスコープを作るから問題ないとこと
8
8
 
9
9
 
10
10
 
11
11
  ```JavaScript
12
12
 
13
- for (var i = 0; i < 3; i++) {
13
+ for (let i = 0; i < 3; i++) {
14
14
 
15
15
  const x = i * 2;
16
16
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  console.log("ended i:", i);
26
26
 
27
- // ended i: 3
27
+ // Uncaught ReferenceError: i is not defined
28
28
 
29
29
 
30
30
 
@@ -36,23 +36,23 @@
36
36
 
37
37
 
38
38
 
39
- JavaScriptではfor文で定義したiはループ終了後でも平然と使えるから同じスコープでやってる事が確認出来るけど、
39
+ JavaScriptではfor文で定義した変数はループ終了後でも平然と使えるんだけど、
40
40
 
41
- constやletは論理的なブロックスコープ区切っ上手にブロックしてるね。
41
+ letやconstを使う事for文の中でせき止められててイケて挙動になったね。
42
42
 
43
43
 
44
44
 
45
- varとlet・constの仕様が違うのは、個人的にはまたJSが例外の継ぎ接ぎ対応しやがったksg大変お怒りだけど、
45
+ varとlet・constの仕様が違うのは、またJSお得意の継ぎ接ぎ対応かよ思わなくもないけど、
46
46
 
47
47
  ES2015時代のコードはvarを使いませんって話なら整合性取れるしありだね。
48
48
 
49
49
 
50
50
 
51
- 思ったけど、懸念点が出てきた。
51
+ と、ここで懸念点が出てきたので検証
52
52
 
53
- Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないかと思ってたで試してみた。
53
+ Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないの
54
54
 
55
- 参考URL: [Babel公式サイトトップページ](https://babeljs.io/)
55
+ 下記のコードを作って[Babel公式サイトトップ](https://babeljs.io/)に貼り付けて検証してみた。
56
56
 
57
57
 
58
58
 
@@ -60,7 +60,7 @@
60
60
 
61
61
  // ES2015
62
62
 
63
- for (var i = 0; i < 3; i++) {
63
+ for (let i = 0; i < 3; i++) {
64
64
 
65
65
  const x = i *2;
66
66
 
@@ -68,19 +68,23 @@
68
68
 
69
69
  }
70
70
 
71
+ console.log(i);
72
+
71
73
  console.log(x);
72
74
 
73
75
 
74
76
 
75
77
  // Babelでコンパイル
76
78
 
77
- for (var i = 0; i < 3; i++) {
79
+ for (var _i = 0; _i < 3; i++) {
78
80
 
79
- var _x = i *2;
81
+ var _x = _i *2;
80
82
 
81
83
  console.log(_x);
82
84
 
83
85
  }
86
+
87
+ console.log(i);
84
88
 
85
89
  console.log(x);
86
90
 

2

loop内でのconstの使用に関して考察を追記

2017/08/26 05:13

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -2,7 +2,101 @@
2
2
 
3
3
 
4
4
 
5
- 何回も呼んだら駄目に決まってるでしょ!!
5
+ JSだとfor文でスコープ作らないから何回も呼んだら駄目に決まってるでしょ!!
6
+
7
+ …と思ったのだけど、指摘があったので考察し直し。
8
+
9
+
10
+
11
+ ```JavaScript
12
+
13
+ for (var i = 0; i < 3; i++) {
14
+
15
+ const x = i * 2;
16
+
17
+ console.log(x);
18
+
19
+ }
20
+
21
+ // 0, 2, 4 の順に出力
22
+
23
+
24
+
25
+ console.log("ended i:", i);
26
+
27
+ // ended i: 3
28
+
29
+
30
+
31
+ console.log("ended x:", x);
32
+
33
+ // Uncaught ReferenceError: x is not defined
34
+
35
+ ```
36
+
37
+
38
+
39
+ JavaScriptではfor文で定義したiはループ終了後でも平然と使えるから同じスコープでやってる事が確認出来るけど、
40
+
41
+ constやletは論理的なブロックスコープで区切って上手にブロックしてるのね。
42
+
43
+
44
+
45
+ varとlet・constの仕様が違うのは、個人的にはまたJSが例外の継ぎ接ぎ対応しやがったksgと大変お怒りだけど、
46
+
47
+ ES2015時代のコードはvarを使いませんって話なら整合性取れるしありだね。
48
+
49
+
50
+
51
+ …と思ったけど、懸念点が出てきた。
52
+
53
+ Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないかと思ってたので試してみた。
54
+
55
+ 参考URL: [Babel公式サイトトップページ](https://babeljs.io/)
56
+
57
+
58
+
59
+ ```JavaScript
60
+
61
+ // ES2015
62
+
63
+ for (var i = 0; i < 3; i++) {
64
+
65
+ const x = i *2;
66
+
67
+ console.log(x);
68
+
69
+ }
70
+
71
+ console.log(x);
72
+
73
+
74
+
75
+ // Babelでコンパイル
76
+
77
+ for (var i = 0; i < 3; i++) {
78
+
79
+ var _x = i *2;
80
+
81
+ console.log(_x);
82
+
83
+ }
84
+
85
+ console.log(x);
86
+
87
+ ```
88
+
89
+
90
+
91
+ へー、外で使われると困るから存在しない変数名に変化してるんだね。
92
+
93
+ ループ後にxと_xを使うようにしたら_x2に、_x2を使ったら今度は_x3を使うように…
94
+
95
+ これなら普段から使っていく分にも大丈夫だね。賢い!
96
+
97
+
98
+
99
+ ---
6
100
 
7
101
 
8
102
 

1

軽い文章修正

2017/08/26 04:46

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -44,15 +44,19 @@
44
44
 
45
45
 
46
46
 
47
- 表題の書き方は上記では`foo`関数と定義しけど、
47
+ 上記では`foo`関数と一度定義して仕切り直してるけど、
48
48
 
49
- 1回しか使われない関数は無名関数としてその場で定義するという省略形がある。
49
+ 1回しか使われない関数は無名関数としてその場で定義して使うというテクニックがある。
50
50
 
51
- なので表題の中身は無名でもちゃんとした関数であり、各々の要素に適用する関数は相互に影響し合うことはない
51
+ 無名でも関数関数。
52
52
 
53
53
 
54
54
 
55
+ Array.mapという高階関数(厳密にはプロトタイプメソッドだからちょっと違うけど)に渡された関数であって、
56
+
57
+ 1回1回の実行はキチンと区切られている。
58
+
55
- だから無名関数中でも`const`を使用することは問題ない。
59
+ 各々要素に適用する関数は相互に影響し合うことはないから大丈夫
56
60
 
57
61
 
58
62