javascript 以错误的顺序执行

javascript executed in the wrong order

在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!

这不会发生在 Edge 控制台中。

您正在将对象记录到控制台。无论您记录什么,都是对实际对象的引用。由于您更新了对象,引用将反映最新值。

要进行测试,您可以尝试在设置值之前记录 obj.a。

那是因为当你检查

{b:1}

功能已经完成。

如果你在函数完成之前检查obj,你会发现;例如:

控制台上的对象,当表现得像{...:...,...:...}

参考,

当你检查它时,它会向你显示当时 moment.At 对象的快照,对象总是喜欢 {

...:...

...:...

}

例如:

其实这才是当时的真实对象

所以,当你有时间检查 obj 时,函数已经 finished.So,你没有机会在那个时候检查 obj 除了:

JSON.parse(JSON.stringify(obj)); 

再给你一个obj,看看那一刻发生了什么。

这似乎是 Chrome devtools 控制台的一个 bug 功能。例如,如果您 运行 此代码段,您将得到

{
  "b": 1
}

但是如果你同时打开Chrome控制台,你会得到这样的东西:

{b: 1}
  a:1
  b:1

如您所见,第一行反映了记录时的 obj 状态,但当您单击它时,其内容似乎已更新。

记录的对象右侧还有一个蓝色信息工具提示,上面写着:"Value below was evaluated just now",确认这是一个功能,而不是错误。

function fn(obj){
    console.log(obj);
    obj.a = 1;
}

fn({b:1});