Как побочный продукт оптимизации кода, выполняемой современными браузерами, при отладке вы не можете «видеть» все переменные, которые «фактически» находятся в области видимости. Это хорошо известно и было рассмотрено в предыдущем вопросе о SO . Хотя эта функция, безусловно, полезная в производстве, меня сильно раздражает во время разработки, она замедляет меня (это должно быть очевидно).
Теперь мой вопрос: есть ли способ отключить это поведение? Могу ли я отредактировать какой-либо файл конфигурации, или есть плагин для браузера, или, может быть, существует «специальная версия сборки для разработчиков» исполняемого файла браузера? Мне нравится вводить свой код в консоль сразу, когда я пишу новый код, так что это действительно беспокоит меня.
ОБНОВЛЕНИЕ / РЕДАКТИРОВАНИЕ
Вот частичное решение, кредит Paul1365972.
Вы должны запустить браузер Chrome из командной строки со специальными параметрами, например:
- Закройте Chrome полностью
- Запустите Chrome из консоли с
"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax"
Windows аналогичной ОС. - Откройте консоль разработчика и выполните
"%GetHeapUsage()"
. Если вы правильно запустили Chrome с этой опцией, в консоль войдет номер, в противном случае вы получите синтаксическую ошибку.
С этим флагом командной строки вы можете «разговаривать с V8» движком, начиная с команд %
, которые являются синтаксическими ошибками в простом JavaScript. Список доступных команд V8 такого рода был дан в ответе Пола .
В %NeverOptimizeFunction()
этом списке есть что-то, что выглядело так, как будто мне просто нужно позвонить и покончить с этим. К сожалению, эта функция не делает то, на что я рассчитывал, как показано на следующем скриншоте.
((( Другая ссылка из ответа Пола (модуль узла v8-natives) здесь не имеет значения для нас в этом контексте. Все, что он делает - это оборачивает однострочники вокруг вызовов функции "%", чтобы код не падал браузеры которые не v8.)))
(((Я помню время, когда это работало (когда эта оптимизация еще не была изобретена / реализована). Я не знаю, как давно. Десять лет? 15 лет? Что-то в этом роде. Какой была последняя версия Chrome (если любая) и какой была последняя версия Firefox (более уверенная в том, что она существует), где вы могли это сделать? Она не принесет вам награду, но вы получите повышение, если вам это случится, и опубликуйте ее как ответ .)))
РЕШЕНИЕ
СПАСИБО ПЕТР СРНИЦЕК
НОВЫЙ ВОПРОС
Хотя решение Петра очень помогает, оно не идеально. Этот вопрос становится слишком длинным, поэтому я опубликовал новый вопрос о том, как можно улучшить решение Петра. (Конечно, я мог бы отредактировать этот вопрос здесь, но это было бы «неисторически», если вы понимаете, о чем я.)
v8-natives
Библиотека просто оборачивает важные% вызовов в коде в простых библиотеках , которые должны быть noops
в браузере или узле , который не был запущен в специальном флаге --allow-туземцы-синтаксического ..
%NeverOptimizeFunction(foo)
то, что я просто назвал его также для bodyOnload, «просто потому, что», думая: «Ну, это не повредит». Проблема в том, что foo
НЕ деоптимизирован так, как я надеялся. Переменная lorem
невидима. Допустим, я хочу написать некоторый код для перехода в функцию foo. Вместо того, чтобы печатать его в моем текстовом редакторе, я набираю его в консоли разработчика (пока отладчик сидит на foo), проверяю, выполняет ли он то, что я хочу, а затем копирую / вставляю его из консоли в мой текстовый редактор. Вот так я люблю работать. И не могу. Из-за оптимизации. Возьми?
--js-flags
(включая несколько связанных с TurboFan ), а также с несколькими собственными командами V8, прежде чем Paul1365972 опубликовал свой ответ, но я не смог добиться желаемого поведения. Я считаю, что такой подход может оказаться тупиком. Возможно, стоит добавить [v8]
тег к этому вопросу. Кто-то с глубоким пониманием внутренней работы V8 может быть в состоянии уточнить, идет ли этот путь или, возможно, укажет вам правильное направление.