чи можу я вимкнути оптимізацію, тому змінні в межах області застосування із закриттів не "оптимізовані"


11

Як побічний продукт оптимізації коду, який здійснюють сучасні браузери, під час налагодження ви не можете "побачити" всі змінні, які "фактично" знаходяться в області застосування. Це добре відомо, і це було розглянуто в попередньому запитанні тут . Ця особливість, хоча, звичайно, корисна у виробництві, мене дуже дратує під час розвитку, але вона уповільнює мене (це повинно бути очевидно.)

Тепер моє запитання: чи є спосіб вимкнути цю поведінку? Чи можу я відредагувати якийсь файл конфігурації, чи є плагін браузера, чи, можливо, є "спеціальна версія для розробників" для виконуваного браузера? Я люблю вводити свій код в консоль відразу, коли я пишу новий код, тому це насправді клопоче мене.

visualSummaryIffalseConsoleLog

ОНОВЛЕННЯ / редагування

Ось часткове рішення, кредит на Paul1365972.

Потрібно запустити браузер Chrome з командного рядка зі спеціальними параметрами, як-от так:

  1. Закрийте Chrome повністю
  2. Запустіть Chrome з консолі, "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" що є для Windows інших подібних ОС.
  3. Відкрити консоль розробника та виконати "%GetHeapUsage()". Якщо ви правильно запустили Chrome із цим параметром, на консоль буде записано номер, інакше ви отримаєте синтаксичну помилку.

За допомогою цього прапора командного рядка ви можете «спілкуватися з двигуном V8» командами, починаючи з %яких є синтаксичними помилками в простому JavaScript. Список доступних команд V8 подібного роду був наведений у відповіді Павла .

Є %NeverOptimizeFunction()в цьому списку, який є чимось схожим на те, що я просто повинен був би зателефонувати і зробити це з ним. На жаль, ця функція не робить те, на що я сподівався, як показано на наступному екрані.

lorem досі не визначений

((( Інше посилання з відповіді Павла (модуль вузлів v8-natives) для нас тут не має великого значення в цьому контексті. Все, що він робить, це обертає однокласники навколо викликів функції "%", щоб код не вийшов з ладу браузери, які не є v8.)))

((Я пам’ятаю час, коли це спрацьовувало (коли ця оптимізація ще не була придумана / впроваджена). Не знаю, як давно. Десять років? 15 років? Щось подібне. Якою була остання версія Chrome (якщо будь-яка) і яка була остання версія Firefox (більш впевненою, що вона існує), де ви могли б це зробити? Це не отримає вам винагороду, але ви отримаєте нагороду, якщо ви дізнаєтесь і опублікуєте це як відповідь .)))

РІШЕННЯ

ДЯКУЮ ПЕТР СРНИЧЕК

хакі виправити

НОВЕ ЗАПИТАННЯ

Хоча рішення Петра дуже допомагає, воно не є ідеальним. Це питання стає занадто довгим, тому я розмістив нове запитання про те, як можна поліпшити рішення Петра. (Я, звичайно, міг би відредагувати це питання тут, але це було б "неісторично", якщо ви знаєте, що я маю на увазі.)


ненавмисні наслідки, глава tenthousandone. ця оптимізація негативно впливає на мій стиль кодування. Мені здається, що я використовую старомодний цикл (замість .map, .forEach, .reduce) більше, ніж я б інакше, так що я уникаю цього питання.
mathheadinclouds

v8-nativesБібліотека просто обертає важливі% викликів в коді в простих бібліотеках , які повинні бути noopsв браузері або вузлі , який не був запущений в спеціальному прапорі --allow-тубільці-синтаксичного ..
Натанаїл

Я провів кілька тестів, функція 'bodyOnLoad' все одно не оптимізована; тож використання внутрішніх команд, щоб спробувати примусити його знеоптимізувати, нічого не робить.
Натанаїл

@Nathanael: Важливий дзвінок - %NeverOptimizeFunction(foo)я просто назвав його також для bodyOnload, "просто тому, що", думаючи "добре, це не зашкодить". Проблема полягає в тому, що fooНЕ деоптимізується так, як я сподівався. Змінна loremневидима. Скажімо, я хочу написати якийсь код, який повинен перейти у функцію foo. Замість того, щоб вводити його у свій текстовий редактор, я набираю його в консоль розробника (поки налагоджувач сидить в колонтитулі), бачу, чи він робить те, що я хочу, а потім копіюю / вставляю його з консолі до мого текстового редактора. Ось так я люблю працювати. І не може. Через оптимізацію. Отримаєте?
mathheadinclouds

1
Я провів кілька наших експериментів з різними --js-flags(включаючи кілька пов'язаних з TurboFan ), а також з декількома нативними командами V8 до того, як Paul1365972 опублікував свою відповідь, але мені не вдалося досягти бажаної поведінки. Я вважаю, що такий підхід може бути тупиком. Можливо, варто додати [v8]тег до цього питання. Хтось із глибоким розумінням внутрішніх функцій V8, можливо, зможе уточнити, чи це шлях, чи, можливо, вказати на вас у правильному напрямку.
Петро Среньчек

Відповіді:


2

Ви можете отримати доступ до всіх змінним, обернувши заяву відладчика в якості Eval , як це: eval("debugger;");. Це хакі-рішення додає ще одну анонімну функцію до стеку викликів, однак це, очевидно, не приносить корисних точок, які встановлюються в DevTools вручну.

Це здається не дуже вдалим рішенням, але оскільки це єдине, що досягає наміченої поведінки поки що, я розміщую це як відповідь.


мене начебто дивує, що це працює. Ви знаєте, я спробував ввести eval ("lorem"), і це дало ту саму помилку "lorem is not unknown". Для мене не має великого сенсу, що введення eval ("lorem") на консолі (тоді як на виправлення налагодження у функції foo) має робити щось інше, ніж те, що робить eval ("налагоджувач") - очікуйте, надрукуйте "ipsum" до консолі. Але вони дуже різні. Дивно.
mathheadinclouds

Це цікава робота. Це трохи хакі, тому що ви не можете вийти з оператора налагодження (вам потрібно вручну перейти на вихідний файл), інакше ви втрачаєте весь стек і повертаєтесь до функції, що називається eval; залишаючи вам зменшений стек, не вистачаючи іншого контексту.
Натанаїл

ви можете змінити цей трюк таким чином: замість eval ("налагоджувач"), поставте просто eval ("") - але багато з них, розподілених по коду, скрізь, де ви думаєте, що ви хочете "розширену точку розриву". Потім ви можете встановити точку розриву (за допомогою інструментів розробки), де є одне з цих операторів eval (''), і як тільки ви зупинитесь там, ви зробите "крок". Я розглядаю можливість написати невеликий транспілер (велике слово для невеликої речі, яку я роблю), ставлячи ці твердження на початку кожної функції. stackoverflow.com/questions/59159996 / ...
mathheadinclouds

Я просто спробував замінити eval ("налагоджувач") на eval (); відладчик, і отримав різні результати, залежно від використання firefox або chrome. i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome використовує V8 JS-Engine, ви можете вмикати вхідні дзвінки до нього за допомогою синтаксису --allow-natives-синтаксис, це відкриває безліч корисних функцій налагодження (повний список тут ), як той, який ви шукаєте:% NeverOptimizeFunction () . Без цього прапора ці виклики були б незаконним синтаксисом, тому будьте обережні при розгортанні (або використайте бібліотеку v8-Natives ).

Щоб увімкнути цю функцію, просто відкрийте chrome за допомогою --js-flags = "- enable-natives-syntax" (використовуйте це лише для налагодження надійних веб-сайтів, оскільки це може надати недовірений js-код доступу до речей, до яких ви дійсно не хочете. мати доступ до).


Дякую тобі. Прочитайте моє оновлене запитання. Здається, цілком ймовірно, що ви знайшли рішення тут, але мені потрібно ще дещо роз'яснення, щоб його реалізувати. Якщо це працює, ви впевнені, що заслуговуєте на винагороду.
mathheadinclouds

tl; dr замість цього використовується --js-flags = "- enable-natives-syntax". Щоб увімкнути цю функцію, V8 ​​JS-Engine потрібно запустити із прапором синтаксису --allow-natives-synts, однак ви не можете запустити його безпосередньо, це робота із хромами. Отже, ви повинні сказати хромувати, щоб запустити двигун із прапором, як це зробити? Просто перенесіть згаданий прапор двигуна через --js-flags = <ваш прапор тут> для chrome.
Paul1365972

ніпе. Просто спробував це ще раз, щоб бути однією безпечною стороною. Я спробував --allow-natives-syntaxі --js-flags="--allow-natives-syntax"багато разів, як "річ, яку я набираю після" chrome "в консолі операційної системи". Якби я сам цього не пробував, я теж вважаю, що помилка друку - це найімовірніше пояснення. Я зробив ще один скріншот. i.stack.imgur.com/7cpPP.png Бачите друк ? Будь ласка, дайте мені чесну відповідь: ви щойно "прочитали та зрозуміли статтю" (щоб бути зрозуміло, нічого поганого в цьому, якщо ви більше не вимагаєте), чи ви насправді все пробували на своїй машині? thx
mathheadinclouds

лише здогадка: може, я цього не роблю запускаю виконувану хрому за допомогою цього параметра, але що я компілюю джерела chrome C ++ (або будь-які інші) з цим параметром?
mathheadinclouds

1
Це дивно, що я просто перевірив це, і він працював чудово, не потрібно компілювати. Я просто напишу саме те, що я зробив, щоб не було непорозумінь. 1. Закрийте Chrome повністю 2. Запустіть Chrome з консолі за допомогою "C: / Program Files (x86) /Google/Chrome/Application/chrome.exe" --js-flags = "- синтаксис дозволених націй" 3. Відкрити консоль розробника та виконати "% GetHeapUsage ()", щоб перевірити, чи все працює
Paul1365972

0

Я дуже сподіваюсь, що на це запитання існує реальна відповідь. Далі не є реальною відповіддю, це імпровізація. Я написав допоміжний інструмент, за допомогою якого ви можете створити тупий помічник коду форми if (false) { console.log(variables, from, closures); }(див. Питання, знятий на екрані), використовуючи статичний аналіз - ви вставляєте в свій код, створюється дурне твердження, ви можете скопіювати його, тоді вам не потрібно набрати його. Я не знаю, чи багато це допомагає, оскільки все це копіювання та вставлення вимагає часу, але це те, що я отримав.

скріншот

скрипка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.