回答編集履歴

2

追記

2019/10/08 06:38

投稿

Zuishin
Zuishin

スコア28669

test CHANGED
@@ -41,3 +41,41 @@
41
41
 
42
42
 
43
43
  setTimeOut の場合、まず setTimeOut が実行され、その ID が id に入り、指定時間後に登録された関数が実行されます。どこが違いますか?
44
+
45
+
46
+
47
+ # 追記 - この回答で定義の順序について触れていない理由
48
+
49
+
50
+
51
+ 一般に、変数の種類や型をコンパイラ・インタプリタに示すことを「宣言」と言い、変数の領域を確保するよう指令を出すこと、もしくは初期化することを「定義」と呼びます。
52
+
53
+
54
+
55
+ let id = setTimeout(abc, 1000); の場合、定義はいつになるでしょうか?
56
+
57
+ 戻り値が何であるかがあらかじめわかっているなら、戻り値が返る前にメモリを確保することができます。しかし、戻り値が何であるかわからない場合、返ってきた戻り値を見てからメモリを確保することになります。
58
+
59
+
60
+
61
+ [https://jsprimer.net/basic/variables/#let](https://jsprimer.net/basic/variables/#let)
62
+
63
+
64
+
65
+ > 次のコードでは、bookTitleという変数を**宣言**し、初期値を"JavaScriptの本"という文字列であることを**定義**しています。
66
+
67
+
68
+
69
+ 引用先でこのように書かれている通り、「宣言」と「定義」には意味合いの違いがあります。
70
+
71
+
72
+
73
+ 「定義」が行われるのは「ソースコードを書いた時点」とも考えられます。その場合、定義は何よりも早く行われたと言えます。
74
+
75
+
76
+
77
+ しかし、動的言語で戻り値が確定してからメモリが確保されたということであれば、定義は「戻り値が確定してから」つまり一番最後で、それまでは未定義ということも考えられます。JavaScript の場合は初期化しない変数が参照された時は undefined つまり未定義を表す値になります。
78
+
79
+
80
+
81
+ つまり「定義」がいつ行われたかを論じるには、その前に解決しておかなければならない課題があり、一概に言えることではありません。定義の順序については扱わないのが筋だと思います。

1

修正

2019/10/08 06:38

投稿

Zuishin
Zuishin

スコア28669

test CHANGED
@@ -29,3 +29,15 @@
29
29
  このコードでは func の実行中と実行後に result の値を出力しています。
30
30
 
31
31
  それぞれ 1 と 4 が出力されます。
32
+
33
+
34
+
35
+ # 追記
36
+
37
+
38
+
39
+ [WindowOrWorkerGlobalScope.setTimeout()](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
40
+
41
+
42
+
43
+ setTimeOut の場合、まず setTimeOut が実行され、その ID が id に入り、指定時間後に登録された関数が実行されます。どこが違いますか?