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

回答編集履歴

2

コメントへの回答を追加

2019/08/15 15:32

投稿

querykuma
querykuma

スコア777

answer CHANGED
@@ -41,4 +41,18 @@
41
41
  varが0の時**setitimeout関数は実行します**が**functionの中身は実行しません**。
42
42
  **functionの中身を実行するのは指定ミリ秒後**です。
43
43
 
44
- 指定ミリ秒後が2秒後とすれば、2秒後にはvar変数の値は5になっています。
44
+ 指定ミリ秒後が2秒後とすれば、2秒後にはvar変数の値は5になっています。
45
+
46
+
47
+ > しかし、そうなりますと疑問な点が生じてしまうのですが、何故、質問本文に記載させて頂きましたコードの2つ目のfor文(letを使用している方)の場合では、0から4が順に出力されることになるのでしょうか?
48
+
49
+ 変数letはブロックスコープだからと思います。
50
+ 変数letのときforループのループブロックごとに別の箱(メモリの場所)が用意されます。
51
+ 同じ変数letでも別の箱を見ています。
52
+ 変数にletを使うことでプログラムに不具合が起きにくくなるようです。
53
+
54
+ ![箱のイメージ](cd5ba91f71bc75af69eeadb11d83d48f.png)
55
+
56
+ こちらは別の回答のために作成した図です。
57
+
58
+ varは1つの箱を使いまわしして、letは箱をいっぱい作ると理解しています。

1

コメントの回答を追加

2019/08/15 15:32

投稿

querykuma
querykuma

スコア777

answer CHANGED
@@ -4,4 +4,41 @@
4
4
  - [for文における、letとvarの挙動の違い](https://teratail.com/questions/205789)
5
5
 
6
6
  var変数の箱は1つだけでlet変数の箱はループブロックの数だけいっぱいあります。
7
- 最初のfor文はsetTimeoutの時間差後に1つのvar変数(ループ終了後に5になる)を出力しています。
7
+ 最初のfor文はsetTimeoutの時間差後に1つのvar変数(ループ終了後に5になる)を出力しています。
8
+
9
+ ##### コメントの回答
10
+
11
+ > 自分の認識では、varが0の時setitimeout関数が実行され、console.log(i)によって「0」が出力されると思うのですが、そうではないのでしょうか...?
12
+
13
+ setitimeout関数はdelayミリ秒の後にfunctionを実行するものです。
14
+
15
+ > var timeoutID = scope.setTimeout(function[, delay]);
16
+
17
+ [WindowOrWorkerGlobalScope.setTimeout() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
18
+
19
+ ```
20
+ setTimeout(function () {
21
+ console.log(i);
22
+ }, 1);
23
+ ```
24
+
25
+ で1ミリ秒後(1秒の1/1000)にしていることが理解を妨げていると思います。
26
+
27
+ ```
28
+ setTimeout(function () {
29
+ console.log(i);
30
+ }, 2000);
31
+ ```
32
+
33
+ として2000ミリ秒後(2秒後)にしましょう。
34
+
35
+ > varが0の時setitimeout関数が実行され、console.log(i)によって「0」が出力されると思うのですが、そうではないのでしょうか...?
36
+
37
+ コンピューターの計算は爆速ですから、2秒後にはfor文のvar i=0からi=4まで実行されて終わっています。
38
+
39
+ setitimeout関数は指定ミリ秒後にfunctionを実行するものです。
40
+
41
+ varが0の時**setitimeout関数は実行します**が**functionの中身は実行しません**。
42
+ **functionの中身を実行するのは指定ミリ秒後**です。
43
+
44
+ 指定ミリ秒後が2秒後とすれば、2秒後にはvar変数の値は5になっています。