var foo = 0, bar = 0
process.nextTick(function() {
debugger
})
使用node debug
输入节点REPL,并尝试打印一些变量,我发现无法访问foo
和bar
:ReferenceError: foo is not defined
var foo = 0, bar = 0
process.nextTick(function() {
console.log(foo)
})
process.nextTick(function() {
debugger
})
但不知怎的,我从另一个异步回调函数访问'foo
,它变得可见,打印bar
仍然引发ReferenceError
。
是关于V8 JIT还是节点实现细节?
答案 0 :(得分:0)
代码似乎没有任何问题,我不确定您是如何使用调试器的,可以尝试使用node-inspector来获得更好的调试体验。
您始终可以使用console.log获取当前范围值。浏览器环境中的相同示例。
var foo = 0, bar = 0
window.setTimeout(function() {
console.log(foo, bar);
}, 0);

答案 1 :(得分:0)
是的,这是关于V8“优化”范围的 - 它省略了函数内部代码实际未引用的变量,即使它们应该在范围内。
如果要在函数内部调试期间查看变量,可以添加引用该变量的无操作代码行。这将迫使V8编译器在该范围内使变量可用。
我想知道是否有另一种方式?...你是否能以某种方式告诉V8保留更多的东西?