【问题标题】:What is the latest behavior of "console.log" regarding its latency in execution, across the popular browsers?在流行的浏览器中,“console.log”在执行延迟方面的最新行为是什么?
【发布时间】:2018-04-14 05:52:37
【问题描述】:

我在试验 JavaScript,最终得到了这个 sn-p:

var num = new Number(20);

function f(n) {
n["foo"] = "bar";   
} 

// the printed object has a "foo" property.
console.log(num, f(num));

我从没想过打印的对象会在f(num) 调用中添加foo 属性,因为f(num) 在我的console.log 中的num 之后(我使用的是Chrome)。

但这发生了,我的第一反应是console.log 是在运行所有的参数并打印出结果或其他东西,所以我查看了 MDN 的 console.log 文档,但没有任何相关内容.

然后我偶然发现了this StackOverflow 问题。

第二个和第三个问题说console.log与对象一起使用时有点晚了,但在这种情况下,以下sn-p中的打印对象也应该具有foo属性(因为它是Number 对象),它不会:

var num = new Number(20);

function f(n) {
n["foo"] = "bar";   
} 

// no "foo" property
console.log(num);
f(num);


我提到的问题的公认答案几乎说明了第二个和第三个答案所说的内容,除了它还指出行为取决于控制台或浏览器。那么,现在不同的浏览器如何处理这种事情(这个问题来自 6 年前)? console.log 是否仅对超大对象异步?最初的问题是,为什么我的第一个示例中的 num 会打印出带有 foo 属性?

【问题讨论】:

  • 显然 console.log() 在 Chrome 中是“某种”异步的。前几天也出现类似问题:stackoverflow.com/questions/47046935
  • 这个问题也没有得到回答,这有点令人沮丧。但是,如果它是异步的,那么什么时候是异步的呢?正如我在第二个示例中所展示的那样,它应该不是异步的(根据我链接到的问题的答案)。
  • @Taurus 这并不是真正的异步,但检查对象可能是异步完成的。详情请见here

标签: javascript google-chrome firefox console console.log


【解决方案1】:
// the printed object has a "foo" property.
console.log(num, f(num));

此行为并非特定于 console.log。在函数开始运行之前,对函数的所有参数进行评估(按顺序)。由于f(num)console.log 的参数,因此在console.log 有机会查看num 之前调用它。

本质上,发生了什么是:

var arg1 = num;
var arg2 = f(num); // modifies num in place, so arg1 changes as well
console.log(arg1, arg2);

【讨论】:

  • 太棒了!这是我所追求的微妙而重要的信息。正是我想要的。
  • 现在我想起来了,感觉真的很自然,如果我把“console.log”看作是一个正常的函数,我就不会感到困惑了。实际上,这也是一个更长的故事。
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多