你能为调试模式关闭javascript垃圾收集器吗?

时间:2017-10-18 14:54:47

标签: javascript debugging garbage-collection closures mark-and-sweep

当我调试javascript时,我经常遇到由于范围问题导致我无法访问假设通过闭包提供给我的变量。

我可以遍历堆栈级别以使自己处于这种情况的正确范围内,但是当你处理promises / async调用时,这是非常令人困惑的并且不能解决问题。

我相信这是一个垃圾收集器标记和扫描未使用的变量的功能(如果我错了,请纠正我)。

是否存在一种模式,我可以转向以保留闭包变量(是的,我知道这可能导致没有任何垃圾收集,但在调试时仍然有用,不应该影响应用程序的行为)< / p>

此问题的代码:

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')

------------编辑-------------

更新示例

1 个答案:

答案 0 :(得分:2)

假设这实际上是因为优化决策而没有首先捕获外部范围 - 这意味着不涉及垃圾收集 - 有些事情可以尝试:

let singularity = null;
function blackhole(val) {
  singularity = val;
}

function someScope() {
  var abc = 'abc'
  var arr = [1...100] // pseudocode

  arr.map(n => {
      debugger;
      blackhole(abc); // forces abc to be captured
      // or ...
      eval(""); // eval leads to more conservative optimizations
    })
}

function someScope() {
  var abc = 'abc'
  var arr = [1...100] // pseudocode

  // normal functions are not as easily optimized as arrow functions
  arr.map(function() {
    debugger;
  })
}

或者,假设您使用的是Firefox,请转到about:config并设置javascript.options.baselinejit = false

一般的想法是强制编译器不执行抛弃未使用的外部作用域的优化。