2016-01-14 47 views
1

我正在调试Intellij中的NodeJS应用程序。我有一个看起来如下的方法:IntelliJ NodeJS调试回调范围参考错误

function(connection) { 
    connection.on('error', function(error) { 
    console.log('there is an error'); // breakpoint is on this line 
    }); 
} 

当断点被击中,connection没有定义,并把connection在计算表达式窗口收益率“的ReferenceError:不定义的连接。”

这在我看来,connection被释放,因为它没有被回调中使用,但我调试应用程序,所以我怎样才能使它不被释放,短期将行localConnection = connection(这不工作)。

再举一例:

var foo = (function() { 
    var a = 'some value'; 
    this.bar = function() { 
    console.log('bar'); // breakpoint is here 
    }; 
    this.bar(); 
})(); 

这里,a是来自调试器无法访问。

EDIT

为了阐明第二实例中,a是私有的foo外部声明的方法,而不是其他。案例分析:

var foo = (function() { 
    var a = 'Some value'; 
    this.bar = function() { 
    console.log('a: ' + a); // breakpoint is here 
    }; 
    this.bar(); 
})(); 

这个例子可以打印“答:有些价值,”这表明a应该是行内访问。事实上,仅仅通过将其添加到控制台日志中,它可以在该行保持可访问性,这表明它之前的不可访问性是由于垃圾收集或引用计数造成的,在调试环境中,我希望不太严格,因为我希望能够在调试时保持查看代码中不一定使用的变量值的能力。

这同样适用于第一个例子。在代码中使用connection时,它会暴露给调试器,但我试图让它保持暴露,即使没有代码使用情况。我怎么做?我非常乐观,Node有一个运行时标志来实现这一点。

回答

0

第一个例子,连接是一个事件发射器。所以当“错误”事件发生时,外部功能已经完成工作。所以你无法取回它。第二个例子是IIFE,即使看起来不像这样,“a”也是一个私有变量。

您可以使用全局变量来访问它们。我知道这看起来像一个肮脏的解决方法。但它的工作原理,无论如何,这里有一个例子:

var m; 
 
function(connection) { 
 
    m = connection; 
 
    connection.on('error', function(error) { 
 
    console.log('there is an error'); // breakpoint is on this line 
 
    console.log(m); // now you can access connection 
 
    }); 
 
}

+0

谢谢!恐怕情况并非如此。请参阅我的编辑。 – arik