如何获得已优化的变量值?

时间:2015-07-19 16:07:01

标签: javascript debugging firefox javascript-debugger

在Javascript执行期间,某些变量可以“优化”。因此,在调试时(User documentation),这些变量的值不可用于检查。变量视图显示(优化的)消息,如果尝试评估变量,控制台将抛出以下错误:

Error: variable has been optimized out

有没有办法在Firefox中强制执行此类变量的评估或禁用此优化?

3 个答案:

答案 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

   }

}