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

59

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

经常会出现这样的情况,当我在Chrome控制台中单击“保存为全局变量”时,它会显示“无法保存到临时变量”。

输入图像描述

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

这也发生在这个jsfiddle上。

1) 我做错了什么吗?

2) 为什么会这样?

Chrome: 50.0.2661.102 (64-bit) OSX El Capitan 10.11.4

3个回答

137
我能看出 Store As Global Variable 不起作用的两个原因:
1. 选择了错误的控制台上下文
这可能是 Chrome 的一个 bug,但是只有当控制台设置为与记录对象的代码相同的上下文时,才能将对象存储为全局。
实际上,这意味着您可能需要选择正确的 iframe 或 web worker。
例如,在 jsFiddle 上:

在正常的jsFiddle编辑器页面上下文中,我遇到了一个错误。但是如果我将上下文更改为fiddle本身的内容,则可以正常工作:

2. 垃圾回收

为了让Chrome给你一个对象的引用,该对象仍然需要在内存中。如果不是这种情况,它只能抛出错误。

然而,我相信在控制台中显示可以强制V8保持对该值的引用。


2
谢谢!这对我很有帮助(在我的情况下,我需要选择一个 iframe)。 - Oleg Pro
6
太棒了,使用React Native调试器时它排名第二。 - Tope
1
为什么需要切换上下文?这是一个不同的进程吗? - shinzou
@Tope,你找到解决办法了吗?我也在使用React-Native调试器时遇到了同样的问题。 - wheresmyspaceship
@wheresmyspaceship,我不记得是否要确保我已经安装了那个组件。但或许是这样。请原谅。 - Tope
显示剩余2条评论

8
您需要在控制台中创建对象,因为Chrome需要维护对对象的引用。只需将以下内容放入控制台即可:
{why:'dont', you:'work?'}

控制台

如果您查看添加此功能的此版本,它会说:

添加从已打印的对象属性部分(控制台、范围窗格等)访问对象的能力。

据我所知,问题在于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?"}

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

谢谢您的回复!它有效,但我通常也会“存储为全局变量”使用console.log打印的对象,例如,我可以保存通过此HTML页面打印的对象:<script type="text/javascript"> console.log({why:'dont', you:'work?'}) </script> 问题是有时这个“存储为全局变量”不起作用,我不明白为什么。 - Devid Farinelli
1
@DevidFarinelli 我更新了我的答案,为您添加了更多细节和可能的解决方法。 - Gideon Pyzer
再次感谢@Gideon的帮助,这很有趣。今天“存储为全局变量”适用于我的nodejs应用程序,使用console.log({why:'dont', you:'work?'}),但在jsfiddle中不起作用。我很困惑。 - Devid Farinelli
1
@DevidFarinelli 这段代码在 jsFiddle 上无法运行的原因可能是由于控制台中选择的上下文被设置为 fiddle 编辑器,而不是记录对象的 fiddle 结果。 - Matt Zeunert
@MattZeunert 感谢您回答 JSFiddle 评论。我错过了那个。很有道理 :) - Gideon Pyzer
我在 CodePen 中尝试使用 console.log(),但遇到了相同的问题。 - vuquanghoang

2

按下Ctrl+Shift+C,选择打印对象框架中的任何元素,然后再试一次。

这样就可以解决问题了。


我不知道为什么这个有效......但它确实有效。谢谢。 - Tarek Deeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接