在Javascript执行期间,某些变量可以“优化”。因此,在调试时(User documentation),这些变量的值不可用于检查。变量视图显示(优化的)消息,如果尝试评估变量,控制台将抛出以下错误:
Error: variable has been optimized out
有没有办法在Firefox中强制执行此类变量的评估或禁用此优化?
答案 0 :(得分:5)
以防止此优化的方式使用变量。
function NOP() {}
// then in the optimised code
NOP(myvar);
// debugging here should now show `myvar`
答案 1 :(得分:3)
当变量被优化后,"它只是意味着它没有在当前范围的上下文中被修改。因此,JavaScript引擎已经完成了一些优化魔法并暂时将该变量隐藏起来。例如,假设你使用lodash来迭代某种集合。
var parentThingy = [];
var childThingy = [];
_.each (collectionThingy, function(data){
// parentThingy is not being modified inside this callback
// so it will be "optimized away" while you are inside this
// function scope.
var transformed;
if (data.someFlag) {
transformed = transformDataSomehow(data);
}
// childThingy is being modified, so you will be able to
// see its value in the debugger.
if (transformed) {
childThingy.push(transformed);
}
});
// Now that you've exited the callback scope, you will be able to see
// the value of parentThingy again.
if (childThingy.length > 1){
parentThingy.push(childThingy);
}
您可以使用NOP建议强制在回调范围内显示parentThingy,但由于您未在该回调中修改parentThingy,因此您 不需要它。它没有改变,也没有改变。它与您当前正在调试的代码无关。退出回调后,调试器将再次看到parentThingy。
仅供参考:这不是Firefox的事情。 Chrome也做同样的事情,只是使用不同的措辞来表明变量与当前范围无关。
答案 2 :(得分:0)
如果需要调试此变量,则必须在声明该变量的函数内部的某个位置设置断点。
让我们说您需要调试变量
“值”
function(value) {
// If you set the breakpoint somewhere here it is OK
myArray.map(function() {
// If you set the breakpoint here you will get a Error: variable has been optimized out
}
}