回答編集履歴

2

コメントへの回答を追加

2019/08/15 15:32

投稿

querykuma
querykuma

スコア777

test CHANGED
@@ -85,3 +85,31 @@
85
85
 
86
86
 
87
87
  指定ミリ秒後が2秒後とすれば、2秒後にはvar変数の値は5になっています。
88
+
89
+
90
+
91
+
92
+
93
+ > しかし、そうなりますと疑問な点が生じてしまうのですが、何故、質問本文に記載させて頂きましたコードの2つ目のfor文(letを使用している方)の場合では、0から4が順に出力されることになるのでしょうか?
94
+
95
+
96
+
97
+ 変数letはブロックスコープだからと思います。
98
+
99
+ 変数letのときforループのループブロックごとに別の箱(メモリの場所)が用意されます。
100
+
101
+ 同じ変数letでも別の箱を見ています。
102
+
103
+ 変数にletを使うことでプログラムに不具合が起きにくくなるようです。
104
+
105
+
106
+
107
+ ![箱のイメージ](cd5ba91f71bc75af69eeadb11d83d48f.png)
108
+
109
+
110
+
111
+ こちらは別の回答のために作成した図です。
112
+
113
+
114
+
115
+ varは1つの箱を使いまわしして、letは箱をいっぱい作ると理解しています。

1

コメントの回答を追加

2019/08/15 15:32

投稿

querykuma
querykuma

スコア777

test CHANGED
@@ -11,3 +11,77 @@
11
11
  var変数の箱は1つだけでlet変数の箱はループブロックの数だけいっぱいあります。
12
12
 
13
13
  最初のfor文はsetTimeoutの時間差後に1つのvar変数(ループ終了後に5になる)を出力しています。
14
+
15
+
16
+
17
+ ##### コメントの回答
18
+
19
+
20
+
21
+ > 自分の認識では、varが0の時setitimeout関数が実行され、console.log(i)によって「0」が出力されると思うのですが、そうではないのでしょうか...?
22
+
23
+
24
+
25
+ setitimeout関数はdelayミリ秒の後にfunctionを実行するものです。
26
+
27
+
28
+
29
+ > var timeoutID = scope.setTimeout(function[, delay]);
30
+
31
+
32
+
33
+ [WindowOrWorkerGlobalScope.setTimeout() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
34
+
35
+
36
+
37
+ ```
38
+
39
+ setTimeout(function () {
40
+
41
+ console.log(i);
42
+
43
+ }, 1);
44
+
45
+ ```
46
+
47
+
48
+
49
+ で1ミリ秒後(1秒の1/1000)にしていることが理解を妨げていると思います。
50
+
51
+
52
+
53
+ ```
54
+
55
+ setTimeout(function () {
56
+
57
+ console.log(i);
58
+
59
+ }, 2000);
60
+
61
+ ```
62
+
63
+
64
+
65
+ として2000ミリ秒後(2秒後)にしましょう。
66
+
67
+
68
+
69
+ > varが0の時setitimeout関数が実行され、console.log(i)によって「0」が出力されると思うのですが、そうではないのでしょうか...?
70
+
71
+
72
+
73
+ コンピューターの計算は爆速ですから、2秒後にはfor文のvar i=0からi=4まで実行されて終わっています。
74
+
75
+
76
+
77
+ setitimeout関数は指定ミリ秒後にfunctionを実行するものです。
78
+
79
+
80
+
81
+ varが0の時**setitimeout関数は実行します**が**functionの中身は実行しません**。
82
+
83
+ **functionの中身を実行するのは指定ミリ秒後**です。
84
+
85
+
86
+
87
+ 指定ミリ秒後が2秒後とすれば、2秒後にはvar変数の値は5になっています。