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});
在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});