javascript以错误的顺序执行
在Chrome控制台中,似乎第2行在第1行之前执行。为什么?javascript以错误的顺序执行,javascript,node.js,google-chrome,ecmascript-6,chromium,Javascript,Node.js,Google Chrome,Ecmascript 6,Chromium,在Chrome控制台中,似乎第2行在第1行之前执行。为什么? function fn(obj){ console.log(obj); obj.a = 1; } fn({b:1}); // prints {a:1, b:1} in console! WHAT!!! fn({}); // prints {}. OMG. WHAT. This is inconsistent with above behaviour! 在边缘控制台中不会发生这种情况。您正在将对象记录到控制台。
function fn(obj){
console.log(obj);
obj.a = 1;
}
fn({b:1}); // prints {a:1, b:1} in console! WHAT!!!
fn({}); // prints {}. OMG. WHAT. This is inconsistent with above behaviour!
在边缘控制台中不会发生这种情况。您正在将对象记录到控制台。您记录的任何内容都是对实际对象的引用。由于更新了对象,因此参照将反映最新的值
要进行测试,您可以在设置对象a的值之前尝试记录它。这是因为当您检查 {b:1} 该函数已完成 如果您在功能完成前检查obj,您会发现;例如: 控制台上的obj,其行为类似于{…:,…:} 这是一个参考 当您检查它时,它会显示此时obj的快照 { …: …: } 例如: 实际上,这是当时真正的obj 因此,当您有时间检查obj时,功能已经完成。因此,此时您没有机会检查obj,除非: 给你另一个obj看看当时发生了什么。这似乎是Chrome devtools控制台的一个bug功能。例如,如果您运行此代码段,您将得到
{
"b": 1
}
但如果同时打开Chrome控制台,您将得到如下结果:
{b: 1}
a:1
b:1
如您所见,第一行反映了记录时的obj
状态,但当您单击它时,它的内容似乎会更新
在记录的对象右侧还有一个蓝色的信息工具提示,上面写着:“下面的值刚刚被评估过”,它确认这是一个功能,而不是一个bug
功能fn(obj){
控制台日志(obj);
目标a=1;
}
fn({b:1})
但是当运行console.log(obj)
时,obj
尚未更改?正如我所解释的,它是一个参考。更新实际对象后,console中的引用将显示最新的值。尝试在更新值之前放置一个断点,看看会发生什么。打开空对象,它将显示{a:1}。我在谷歌chrome控制台上试用过。当您通过引用进行复制时,我猜当您再次打开对象时,它会从引用中读取,此时obj.a=1已经执行,因此您会看到后面的值。@Johnley顺便说一句,在我的Chrome中,在记录的对象右侧有一个蓝色的信息工具提示,上面写着:“下面的值刚刚计算过”。所以这肯定是一个特性,而不是一个bug:)
{b: 1}
a:1
b:1