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

回答編集履歴

3

文章をチューニング

2017/08/26 05:14

投稿

miyabi-sun
miyabi-sun

スコア21445

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 (var i = 0; i < 3; i++) {
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
- // ended i: 3
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文で定義したiはループ終了後でも平然と使えるから同じスコープでやってる事が確認出来るけど、
20
+ JavaScriptではfor文で定義した変数はループ終了後でも平然と使えるんだけど、
21
- constやletは論理的なブロックスコープ区切っ上手にブロックしてるね。
21
+ letやconstを使う事for文の中でせき止められててイケて挙動になったね。
22
22
 
23
- varとlet・constの仕様が違うのは、個人的にはまたJSが例外の継ぎ接ぎ対応しやがったksg大変お怒りだけど、
23
+ varとlet・constの仕様が違うのは、またJSお得意の継ぎ接ぎ対応かよ思わなくもないけど、
24
24
  ES2015時代のコードはvarを使いませんって話なら整合性取れるしありだね。
25
25
 
26
- 思ったけど、懸念点が出てきた。
26
+ と、ここで懸念点が出てきたので検証
27
- Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないかと思ってたで試してみた。
27
+ Babelなんかでコンパイルしたらvarに変更されるから不具合出るんじゃないの
28
- 参考URL: [Babel公式サイトトップページ](https://babeljs.io/)
28
+ 下記のコードを作って[Babel公式サイトトップ](https://babeljs.io/)に貼り付けて検証してみた。
29
29
 
30
30
  ```JavaScript
31
31
  // ES2015
32
- for (var i = 0; i < 3; i++) {
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 i = 0; i < 3; i++) {
40
+ for (var _i = 0; _i < 3; i++) {
40
- var _x = i *2;
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の使用に関して考察を追記

2017/08/26 05:13

投稿

miyabi-sun
miyabi-sun

スコア21445

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

軽い文章修正

2017/08/26 04:46

投稿

miyabi-sun
miyabi-sun

スコア21445

answer CHANGED
@@ -21,11 +21,13 @@
21
21
  何のための関数か、何のためのconstか全く意味分からないよね。
22
22
  関数定義したのに再利用出来ないじゃんって話になるし…
23
23
 
24
- 表題の書き方は上記では`foo`関数と定義しけど、
24
+ 上記では`foo`関数と一度定義して仕切り直してるけど、
25
- 1回しか使われない関数は無名関数としてその場で定義するという省略形がある。
25
+ 1回しか使われない関数は無名関数としてその場で定義して使うというテクニックがある。
26
- なので表題の中身は無名でもちゃんとした関数であり、各々の要素に適用する関数は相互に影響し合うことはない
26
+ 無名でも関数関数。
27
27
 
28
+ Array.mapという高階関数(厳密にはプロトタイプメソッドだからちょっと違うけど)に渡された関数であって、
29
+ 1回1回の実行はキチンと区切られている。
28
- だから無名関数中でも`const`を使用することは問題ない。
30
+ 各々要素に適用する関数は相互に影響し合うことはないから大丈夫
29
31
 
30
32
  ---
31
33