Как побочный продукт оптимизации кода, выполняемой современными браузерами, при отладке вы не можете «видеть» все переменные, которые «фактически» находятся в области видимости. Это хорошо известно и было рассмотрено в предыдущем вопросе о 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 может быть в состоянии уточнить, идет ли этот путь или, возможно, укажет вам правильное направление.Ответы:
Вы можете получить доступ ко всем переменным, поместив оператор отладчика в eval, например так:
eval("debugger;");
. Это хакерское решение добавляет еще одну анонимную функцию в стек вызовов и, очевидно, бесполезно для точек останова, которые устанавливаются вручную в DevTools.Похоже, это не очень хорошее решение, но поскольку пока оно является единственным, которое достигает желаемого поведения, я публикую его в качестве ответа.
источник
Google Chrome использует V8 JS-Engine, вы можете включить собственные вызовы к нему с помощью флага --allow-natives-syntax, который предоставляет множество полезных функций отладки (полный список здесь ), например ту, которую вы ищете:% NeverOptimizeFunction () , Без этого флага эти вызовы были бы недопустимым синтаксисом, поэтому будьте осторожны при развертывании (или используйте библиотеку V8-Natives ).
Чтобы включить эту функцию, просто откройте chrome с --js-flags = "- allow-natives-syntax" (используйте это только для отладки доверенных веб-сайтов, так как это может дать недоверенному коду js доступ к вещам, которые вы на самом деле не хотите иметь доступ к).
источник
--allow-natives-syntax
и другое--js-flags="--allow-natives-syntax"
несколько раз как «то, что я набираю после« chrome »в консоли операционной системы». Если бы я не попробовал все это сам, я бы тоже подумал, что опечатка - наиболее вероятное объяснение. Я сделал еще один скриншот. i.stack.imgur.com/7cpPP.png Видите опечатку? Пожалуйста, дайте мне честный ответ: вы просто «прочитали и поняли статью» (чтобы быть понятным, в этом нет ничего плохого, если вы не требуете больше), или вы действительно все это попробовали на своей машине? thxЯ действительно надеюсь, что этот вопрос имеет РЕАЛЬНЫЙ ответ. То, что следует, не реальный ответ, это временное решение. Я написал вспомогательный инструмент, с помощью которого вы можете создать глупый вспомогательный код вида
if (false) { console.log(variables, from, closures); }
(см. Снимок экрана) с помощью статического анализа - вы вставляете в свой код, создается глупый оператор, вы можете скопировать его, тогда вам не нужно набрать его. Я не знаю, поможет ли это много, так как копирование и вставка также требуют времени, но это то, что я получил.играть на скрипке
источник