我正在使用Node Monkey调试我的NodeJS应用。
当我点击"存储为全局变量"时经常发生这种情况。在我的Chrome控制台中,它说"无法保存到临时变量。"
console.log({why:'dont', you:'work?'})
这也发生在jsfiddle
中1)我做错了吗?
2)为什么会这样?
Chrome:50.0.2661.102(64位) OSX El Capitan 10.11.4
答案 0 :(得分:59)
我可以看到存储为全局变量的两个原因:
<强> 1。选择了错误的控制台上下文
这可以说是一个Chrome错误,但如果控制台设置为与记录对象的代码相同的上下文,则只能将对象存储为全局。
实际上,这意味着您可能需要选择正确的IFrame或Web worker。
例如,在jsFiddle上:
在正常的jsFiddle编辑器页面上下文中我收到错误。但是如果我将上下文改为小提琴本身的内容,它就有效:
<强> 2。垃圾收集
为了让Chrome为您提供对象的引用,对象仍然必须在内存中。如果不是这种情况,它只会引发错误。
但是,我非常确定在控制台中显示的内容会强制V8保留对该值的引用。
答案 1 :(得分:5)
您需要在控制台本身中创建对象,因为Chrome需要维护对象的引用。只需将以下内容放入控制台:
{why:'dont', you:'work?'}
如果您查看添加了该功能的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?"}
该变量现在存在于内存中,因此您可以存储它。