Chrome DevTools错误:"无法保存到临时变量。"

时间:2016-06-01 07:55:14

标签: node.js google-chrome google-chrome-devtools

我正在使用Node Monkey调试我的NodeJS应用。

当我点击"存储为全局变量"时经常发生这种情况。在我的Chrome控制台中,它说"无法保存到临时变量。"

enter image description here

console.log({why:'dont', you:'work?'})

这也发生在jsfiddle

1)我做错了吗?

2)为什么会这样?

Chrome:50.0.2661.102(64位) OSX El Capitan 10.11.4

2 个答案:

答案 0 :(得分:59)

我可以看到存储为全局变量的两个原因:

<强> 1。选择了错误的控制台上下文

这可以说是一个Chrome错误,但如果控制台设置为与记录对象的代码相同的上下文,则只能将对象存储为全局。

实际上,这意味着您可能需要选择正确的IFrame或Web worker。

例如,在jsFiddle上:

在正常的jsFiddle编辑器页面上下文中我收到错误。但是如果我将上下文改为小提琴本身的内容,它就有效:

<强> 2。垃圾收集

为了让Chrome为您提供对象的引用,对象仍然必须在内存中。如果不是这种情况,它只会引发错误。

但是,我非常确定在控制台中显示的内容会强制V8保留对该值的引用。

答案 1 :(得分:5)

您需要在控制台本身中创建对象,因为Chrome需要维护对象的引用。只需将以下内容放入控制台:

{why:'dont', you:'work?'}

Console

如果您查看添加了该功能的this revision,则会显示:

  

添加从打印的ObjectPropertySections访问对象的功能   (控制台,范围窗格等)。

根据我的理解,问题是console.log正在输出对象的字符串表示,并且只是使用对象格式化程序来很好地显示它。该物体不再存在。当您通过控制台本身创建对象时,Chrome会将对象本身存储在内存中。如果您在断点处暂停并具有本地范围的变量,则这些变量也可以全局存储,因为它们也在内存中。

如果您没有获得循环引用,您可以在代码中执行的一件事是:

console.log(JSON.stringify({why:'dont', you:'work?'}));
> {"why":"dont","you":"work?"}

在控制台中,复制输出并将其粘贴到JSON.parse来电:

JSON.parse('{"why":"dont","you":"work?"}');
> Object {why: "dont", you: "work?"}

该变量现在存在于内存中,因此您可以存储它。