1

当我调试 javascript 时,我经常遇到由于范围问题而无法访问应该通过闭包提供给我的变量的情况。

对于这种情况,我可以遍历堆栈级别以将自己置于正确的范围内,但这非常令人困惑,并且在处理 promises / async 调用时不起作用。

我相信这是垃圾收集器标记并清除未使用变量的功能(如果我错了,请纠正我)。

是否有一种模式可以用来保存闭包变量(是的,我意识到这不会导致垃圾收集,但在调试时仍然有用,并且不应该影响应用程序的行为)

有这个问题的代码:

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

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

更新示例

4

1 回答 1

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.

一般的想法是强制编译器不执行丢弃未使用的外部范围的优化。

于 2017-10-19T20:53:40.830 回答