我有一个包含以下内容的js文件:
(function (context) {
console.log(123);
debugger;
})(this);
然后我以调试模式运行我的脚本:
$ node debug script.js
调试模式中的其他行是否有任何原因未以绿色显示?
如果我在函数内部:
debug> repl
> context
{}
但是当我这样做时:
> this
崩溃......即使按下CTRL + C也无法停止该过程,只能关闭标签。
此外,只需在文件的第一行添加var foo = this
即可修复此行为。
为什么呢?这是一个错误吗?
答案 0 :(得分:1)
在Node挂起的同一个地方(在repl模式下),您要求this
的值,请检查以下值:
this === global
你应该得到true
。此外,如果您要求global
的值,则Node会像this
一样挂起。但是,您可以毫无问题地访问某些字段。我能够访问this.module
(或global.module
)并获得合理的价值。
所以这看起来像一个bug,我冒昧地说这可能是处理循环引用的错误。通常,Node能够通过显示[Circular]
来正确处理它们,但是这里的具体情况似乎存在问题。
执行上述任何操作都会导致调试器为{}
打印this
而不会挂起:
在文件开头添加"use strict";
。
添加debugger;
作为文件的第一个语句。
在文件开头添加带有console.log("start");
等副作用的语句。
以下内容无效:
在文件开头添加一个可以理解为优化的语句,如var x = 1;
或function foo() {}
。
此:
var x = 1;
(function (context) {
console.log(123);
debugger;
})(this);
console.log(x);
调试器在var x = 1
停止,因此它不会被优化掉。