Поведение меняется при вставке пустого вызова console.log()

#javascript #google-chrome

Вопрос:

Код

 var repro_bug = () => {
    var state = { x: 1, y: 1 };

    return () => {
        var toggle = () => {
            state.y = 1;

            console.log(state.x);
        };

        // console.log();

        state.x = state.y;
        state.y = 0;

        toggle();
    };
};

var run = repro_bug();
 

Жук

Если вы звоните run() , он всегда должен регистрироваться 1 . В Chrome 91.0.4472.114 (в Chrome OS 91.13904.0), когда я звоню run() десять раз или около того, вместо этого он начинает регистрироваться 0 .

Странно, но если вы раскомментируете строку 11, пустую console.log , она будет работать так, как ожидалось. Это наводит меня на мысль, что это ошибка в Chrome, потенциально связанная с каким-то невыполнением заказа. Этот пример является самым коротким, который я смог получить, toggle для него необходимы отдельные функция и объект state (вместо двух переменных), чтобы он вел себя странно.

Обратите внимание, что вам нужно выполнить окончательный run() вариант вручную, как показано на скриншотах ниже, чтобы воспроизвести. Вероятно, это каким-то образом связано со временем.

Не может воспроизводиться в узле, а другой человек не может воспроизводиться в Firefox.

Скриншоты

Без комментариев (ожидаемое поведение):

Без комментариев: Журналы 1 с 1 по 11 запуски

Прокомментировал:

Прокомментировано: Регистрирует 1 на 1-10 - м прогонах и 0 на 11-м прогоне

Комментарии:

1. Я сам его воспроизвел.

2. Просто тоже воспроизводится. Вот это забавно.

3. Воспроизводится с выводом журнала, завернутым в JSON.stringify. Теперь пытаюсь настроить утверждение здесь — и да, получил утверждение, не удалось после некоторого настойчивого нажатия на кнопку ввода. 🙂 Интересно, можно ли на это надавить в сценарии Selenium или что-то в этом роде.

4. Вероятно, вам следует просто отправить это как отчет об ошибке Chromium. Хотя это и интересно, на самом деле это не совсем подходит для ЭТОГО.

5. Сообщается Хрому