回答編集履歴

2

スコープを極限まで狭くした(Garbage Collectionに優しい)場合

2018/08/25 09:16

投稿

think49
think49

スコア18166

test CHANGED
@@ -32,4 +32,44 @@
32
32
 
33
33
 
34
34
 
35
+ スコープを極限まで狭くした(Garbage Collectionに優しい)場合。
36
+
37
+
38
+
39
+ ```JavaScript
40
+
41
+ (function () {
42
+
43
+ function createPromise (i) {
44
+
45
+ return new Promise(resolve => setTimeout(resolve, 0, i));
46
+
47
+ }
48
+
49
+
50
+
51
+ {
52
+
53
+ const ps = [];
54
+
55
+
56
+
57
+ for (let i = 0; i < 5; i++) {
58
+
59
+ ps.push(createPromise(i));
60
+
61
+ }
62
+
63
+
64
+
65
+ Promise.all(ps).then(console.log.bind(console));
66
+
67
+ }
68
+
69
+ }());
70
+
71
+ ```
72
+
73
+
74
+
35
75
  Re: yuzunoha123 さん

1

別解

2018/08/25 09:15

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,7 +1,35 @@
1
+ ### var と let
2
+
3
+
4
+
1
5
  `var` は関数スコープなので、変数 i のスコープを共有し、`setTimeout` で登録されたタイマー関数呼び出し時に `i` の値は5です。
2
6
 
3
7
  `let` はブロックスコープなので、変数 i のスコープを共有しません。
4
8
 
5
9
 
6
10
 
11
+ ### 別解
12
+
13
+
14
+
15
+ さておき、クロージャを無駄に生産して、メモリを圧迫するのは考えものです。
16
+
17
+
18
+
19
+ ```JavaScript
20
+
21
+ const ps = [];
22
+
23
+ for (let i = 0; i < 5; i++) {
24
+
25
+ ps.push(new Promise(resolve => setTimeout(resolve, 0, i)));
26
+
27
+ }
28
+
29
+ Promise.all(ps).then(console.log.bind(console));
30
+
31
+ ```
32
+
33
+
34
+
7
35
  Re: yuzunoha123 さん