回答編集履歴

2

コメントに対する追記

2017/07/03 18:58

投稿

krei
krei

スコア39

test CHANGED
@@ -9,3 +9,87 @@
9
9
  console.logは常にconsole.logのある位置の変数内容が表示できるわけではありません。
10
10
 
11
11
  私も何度も騙されたことがありますw
12
+
13
+
14
+
15
+ 追記
16
+
17
+
18
+
19
+ この現象はオブジェクトに対して起こります。console.logに表示される値はコード上のconsole.logのある場所ではなく、ブラウザのコンソールに表示したタイミングでどのような値を持っているかが表示されます。つまりconsole.logの位置より後に代入の行があったとしてもコンソール上で確認するまでに変更が行われた場合変更後の値を目にすることになります。ブレークポイントでは処理自体を止めているので確認までに値が変わることはありません。
20
+
21
+
22
+
23
+ この現象のわかりやすい確認方法としては、次の方法があります。
24
+
25
+ GoogleChromeだとArrayやObjectをコンソール上にだすと、まず1行で変数内容が簡単に表示されており、▶がついていてそれをクリックすると内容を展開して見ることができますよね、これを利用します。
26
+
27
+ その展開内容も▶が押されたタイミングに変数がどのような値を保持しているかを表示するので1行目の簡易表示と展開内容が違う、なんてことが起こります。
28
+
29
+
30
+
31
+ 次のようなコードをコンソールに入力してみてください。
32
+
33
+ ```JavaScript
34
+
35
+ var obj={"bool":true}
36
+
37
+
38
+
39
+ console.log(obj);
40
+
41
+
42
+
43
+ setTimeout(function(){
44
+
45
+ obj.bool=false;
46
+
47
+ }, 5000);
48
+
49
+ ```
50
+
51
+
52
+
53
+ コンソールには次のように表示されていますよね。
54
+
55
+ ```Javascript
56
+
57
+ ▶Object {bool: true}
58
+
59
+ ```
60
+
61
+
62
+
63
+ すぐに▶を押して開くと次のようになります。
64
+
65
+
66
+
67
+ ```JavaScript
68
+
69
+ ▼Object {bool: true}
70
+
71
+ bool:true
72
+
73
+ ▶__proto__:Object
74
+
75
+ ```
76
+
77
+
78
+
79
+ 次にもう一度示したコードをコンソールに入力し、5秒以上経ってから▶を押してください。
80
+
81
+ 次のようになるはずです。
82
+
83
+ ```JavaScript
84
+
85
+ ▼Object {bool: true}
86
+
87
+ bool:false
88
+
89
+ ▶__proto__:Object
90
+
91
+ ```
92
+
93
+
94
+
95
+

1

補足

2017/07/03 18:58

投稿

krei
krei

スコア39

test CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  おそらく期待通りのものが入っています。
4
4
 
5
+ Javascriptのブレークポイントの設定はGoogleChromeならデベロッパーツールのSourceタブの該当行番号をクリックすることで可能です。デベロッパーツールの便利な機能については検索すればたくさん解説記事がヒットするのでここでは紹介しません。
6
+
5
7
 
6
8
 
7
9
  console.logは常にconsole.logのある位置の変数内容が表示できるわけではありません。
10
+
11
+ 私も何度も騙されたことがありますw