- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在阅读 Async Javascript特雷弗·伯纳姆 (Trevor Burnham)。到目前为止,这是一本很棒的书。
他谈到此代码段和 console.log 在 Safari 和 Chrome 控制台中是“异步的”。不幸的是我无法复制这个。这是代码:
var obj = {};
console.log(obj);
obj.foo = 'bar';
// my outcome: Object{}; 'bar';
// The book outcome: {foo:bar};
如果这是异步的,我预计结果将是书籍的结果。 console.log() 被放入事件队列,直到所有代码被执行,然后它被运行并且它会拥有 bar 属性。
它似乎是同步运行的。
我运行这段代码有错吗? console.log 实际上是异步的吗?
最佳答案
console.log
未标准化,因此行为未定义,并且可以在开发人员工具的不同版本之间轻松更改。你的书可能已经过时了,我的回答也很快。
对于我们的代码来说,console.log
是否异步没有任何区别,它不提供任何类型的回调等等;并且您传递的值始终在您调用函数时被引用和计算。
我们真的不知道那时会发生什么(好吧,我们可以,因为 Firebug、Chrome Devtools 和 Opera Dragonfly 都是开源的)。控制台需要将记录的值存储在某处,并将它们显示在屏幕上。渲染肯定会异步发生(被限制为速率限制更新), future 与控制台中记录的对象的交互(如扩展对象属性)也是如此。
因此控制台可能会克隆(序列化)您记录的可变对象,或者它会存储对它们的引用。第一个不适用于深/大物体。此外,至少控制台中的初始呈现可能会显示对象的“当前”状态,即它被记录时的状态 - 在您的示例中,您会看到 Object {}
。
但是,当您展开对象以进一步检查其属性时,控制台很可能只存储了对您的对象及其属性的引用,现在显示它们将显示它们的当前(已经变异)状态。如果单击 +
,您应该能够在示例中看到 bar
属性。
这是在 bug report 中发布的屏幕截图解释他们的“修复”:
因此,某些值可能会在它们被记录后很长时间内被引用,并且对这些值的评估相当惰性(“在需要时”)。这种差异最著名的例子是在问题 Is Chrome's JavaScript console lazy about evaluating arrays? 中处理的。
解决方法是确保始终记录对象的序列化快照,例如通过执行 console.log(JSON.stringify(obj))
。不过,这仅适用于非圆形和相当小的物体。另见 How can I change the default behavior of console.log in Safari? .
更好的解决方案是使用断点进行调试,在断点处执行完全停止,您可以检查每个点的当前值。仅对可序列化和不可变数据使用日志记录。
关于javascript - console.log() 异步还是同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392111/
已经有几个关于捕获或重定向 console.log 的问题: redirect Javascript syntax errors and console.log to somewhere else C
console.log(String(console.log('Not undefined')) === 'undefined'); console.log(String(console.log('N
我知道这是一个新手错误,但我不知道如何修复它。 public static void main (String args[]){ Console kitty = System.console(); S
我正在使用 Visual Studio 2015。 我试图打印一些语句只是为了跟踪一个非常长时间运行的测试。当使用 VSTest.Console 和/Logger:trx 时,调试输出(无论我们使用
这个问题在这里已经有了答案: Accessing console and devtools of extension's background.js (8 个回答) 5年前关闭。 我的 Chrome
我在括号中收到此错误。 我想强调一个事实,这是我第二次打开 JS 文件。 正如我强调的那样,我还想强调一个事实,即我不知道 Eslint 和 node.js 是什么。 StackOverflow 和其
我按照文档中的描述安装了 Drupal Console Launcher: curl https://drupalconsole.com/installer -L -o drupal.phar mv
Console.WriteLine() 和有什么区别和Trace.WriteLine() ? 最佳答案 从“调试”的角度来看这些。 我们开始使用 Console.WriteLine() 进行调试 后来
我一直在尝试连接到 serial console of a Raspberry Pi 3 with Android Things使用USB to TTL cable从我的 Linux (Ubuntu)
namespace Pro { class ErrorLog { public ErrorLog(RenderWindow app) {
以下代码是一个众所周知的示例,用于显示调试版本和发布版本之间的区别: using System; using System.Threading; public static class Program
if (open_date) { open_date = get_date_from_string(open_date); window.console && cons
在 Xcode 中工作时,我通常只为控制台打开一个单独的窗口,以便我可以看到尽可能多的输出行。我今天刚刚更新到 Xcode 12,在更新之前,您可以将编辑器 Pane 和控制台 Pane 之间的分隔线
在 Google Play Console 上,在所有应用程序的第一页,它会显示已安装的受众和用户获取。 我知道已安装的受众是在他们的设备上安装我的应用程序的受众。但什么是用户获取?通常,用户获取的数
Qt Quick uses qDebug执行日志记录,其中标准 Javascript 日志记录方法映射到 Qt 日志类型 console.log() -> qDebug() console.deb
Qt Quick uses qDebug执行日志记录,其中标准 Javascript 日志记录方法映射到 Qt 日志类型 console.log() -> qDebug() console.deb
我有以下代码: bool loop = true; LongbowWorkerThread Worker = new LongbowWorkerThread(); Th
我遇到了这两个 API,用于在 C# 的简单控制台应用程序中读取用户的输入: System.Console.ReadLine() System.Console.In.ReadLine() 这是一个我试
我是编程和 js 的新手,我正在尝试学习 javascript 的关键。 var obj1 = { name: 'rawn', fn: function() { con
using System; namespace ConsoleApplication1 { class Program { static void Main(strin
我是一名优秀的程序员,十分优秀!