【发布时间】:2017-10-18 14:54:47
【问题描述】:
当我调试 javascript 时,我经常遇到由于范围问题而无法访问应该通过闭包提供给我的变量的情况。
对于这种情况,我可以向上遍历堆栈级别以将自己置于正确的范围内,但这很令人困惑,并且在您处理承诺/异步调用时不起作用。
我相信这是垃圾收集器标记和清除未使用变量的功能(如果我错了,请纠正我)。
是否有一种模式可以用来保存闭包变量(是的,我意识到这不会导致垃圾收集,但在调试时仍然有用,并且不应该影响应用程序的行为)
有这个问题的代码:
function hello(arr, foo, bar) {
arr.forEach(item => {
debugger; // HERE `foo`, `arr` and `bar` are reference errors in debugger evaluation
});
return 1
}
hello([1,2,3], 'foo', 'bar')
------------编辑-------------
更新示例
【问题讨论】:
-
not able to access abc even though I am suppose to对我来说就像一个魅力。您能否提供一个示例来重现您的实际问题?I can traverse up a stack level to put myself in the correct scope for this case, but this is quite confusing and doesn't do the trick when you deal with promises / async calls所以你在理解嵌套作用域时遇到了问题,以及函数如何从周围作用域访问变量?还是您所拥有的时间有问题,并且变量可能已经改变了它们的值,直到承诺得到解决? -
您可以尝试关闭 jit 编译,即让它在解释器模式下运行
-
@the8472 是这个名字吗?
-
@Thomas 并不是说我没有时间上下遍历,而是在调试时不能在运行时访问特定点的当前变量。遍历只能解决同步代码模式,所以就是这样,但这困扰我的主要原因是调试器没有反映真正的可访问范围。
-
实际上,您说 “我可以遍历堆栈级别以将自己置于这种情况下的正确范围内,但这很令人困惑,并且在您处理承诺/异步调用。” - 这实际上是关于堆栈行走不显示变量还是关于垃圾收集?
标签: javascript debugging garbage-collection closures mark-and-sweep