OS X下的NodeJS v0.10.31,在NodeJS v0.12.2下的相同行为。
正常调用时,我的堆栈跟踪不显示test
函数名称:
function test() {
throw new Error('Missing `test` in stack trace?');
}
try {
test();
} catch (e) {
console.trace(e);
}
输出:
Trace: [Error: Missing `test` in stack trace?]
at Object.<anonymous> (no_stack_in_node.js:8:11)
// etc.
如果它在setTimeout
内,我会看到我的期望:
try {
setTimeout(test, 0);
} catch (e) {
console.trace(e);
}
输出:
Error: Missing `test` in stack trace?
at test [as _onTimeout] (no_stack_in_node.js:2:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)
在浏览器中,我在两种情况下都会看到后者。
是否有某些特定的东西我缺失,或者是NodeJS的CLI干扰环境,例如,“顶级对象”的行为有点不同?
答案 0 :(得分:2)
在Node.js中,模块中的所有代码都将包装在匿名函数中,如下所示
(function (exports, require, module, __filename, __dirname) {
// our actual module code
});
所以你的实际代码会像这样包装
(function (exports, require, module, __filename, __dirname) {
function test() {
throw new Error('Missing `test` in stack trace?');
}
try {
test();
} catch (e) {
console.trace(e);
}
});
有关详细说明,请参阅scipy.ndimage.zoom。
因此,当您跟踪e
的位置时,它实际上是一个匿名函数。这就是为什么它说Object.<anonymous>