使用`this`来调用匿名函数时,NodeJS调试器是否会崩溃?

时间:2014-01-23 11:56:53

标签: javascript node.js debugging

我有一个包含以下内容的js文件:

(function (context) {
    console.log(123);
    debugger;
})(this);

然后我以调试模式运行我的脚本:

$ node debug script.js
  

调试模式中的其他行是否有任何原因未以绿色显示?

如果我在函数内部:

debug> repl
> context
{}

但是当我这样做时:

> this

崩溃......即使按下CTRL + C也无法停止该过程,只能关闭标签。

此外,只需在文件的第一行添加var foo = this即可修复此行为。

为什么呢?这是一个错误吗?

1 个答案:

答案 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停止,因此它不会被优化掉。