Как получить значение переменной, которая была оптимизирована?

Некоторые переменные могут быть «оптимизированы» во время выполнения Javascript. Таким образом, значения таких переменных недоступны для проверки при отладке (Документация пользователя). В представлении переменных отображается сообщение (оптимизировано), а консоль выдает следующую ошибку при попытке оценить переменную:

Error: variable has been optimized out

Есть ли способ принудительно оценить такую ​​переменную или отключить эту оптимизацию в Firefox?


person czerny    schedule 19.07.2015    source источник
comment
Можете ли вы предоставить пример кода JS, который запускает эту оптимизацию?   -  person simbabque    schedule 19.07.2015
comment
stackoverflow.com/help/mcve   -  person Lightness Races in Orbit    schedule 19.07.2015
comment
Покажите нам фактический код, который приводит к этому.   -  person jfriend00    schedule 19.07.2015


Ответы (3)


Используйте переменную таким образом, чтобы предотвратить эту оптимизацию.

function NOP() {}

// then in the optimised code

    NOP(myvar);
    // debugging here should now show `myvar`
person Paul S.    schedule 19.07.2015
comment
Это показано для предотвращения оптимизации с помощью кода, но не для того, чтобы получить значение, когда оно было оптимизировано. Можете ли вы заставить браузер (здесь я считаю, что вопрос касается именно Firefox, хотя он этого не говорит) от оптимизации? (Более вероятно здесь). - person ruffin; 06.11.2020

Когда переменная была «оптимизирована», это просто означает, что она не изменяется в контексте текущей области. Следовательно, движок 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 делает то же самое, просто использует другую формулировку, чтобы указать, что переменная не имеет отношения к текущей области.

person SeanH    schedule 02.10.2015
comment
Я бы категорически не согласился с утверждением, что вам не нужно это видеть. Если вы разрабатываете код и экспериментально ковыряетесь с различными значениями, пытаясь что-то отладить, вполне возможно, что вам нужно это увидеть. Не иметь возможности увидеть это, кроме как с помощью хакерского трюка NOP(), это ... разочаровывает. - person Stewart; 01.02.2018

Если вам нужно отладить эту переменную, вы должны установить точку останова в том месте внутри функции, где эта переменная объявлена.

Допустим, вам нужно отладить переменную

"ценность"

function(value) {
   // If you set the breakpoint somewhere here it is OK

   myArray.map(function() {

       // If you set the breakpoint here you will get an Error: variable has been optimized out

   }

} 
person Elio    schedule 20.11.2018