Als Nebenprodukt der Codeoptimierung, die von modernen Browsern beim Debuggen durchgeführt wird, können Sie nicht alle Variablen "sehen", die "sachlich" im Geltungsbereich liegen. Dies ist bekannt und wurde in einer früheren Frage hier auf SO angesprochen . Diese Funktion ist zwar in der Produktion sehr nützlich, nervt mich aber während der Entwicklung sehr, verlangsamt mich jedoch (das sollte offensichtlich sein).
Meine Frage ist nun, gibt es eine Möglichkeit, dieses Verhalten auszuschalten? Kann ich eine Konfigurationsdatei bearbeiten oder gibt es ein Browser-Plugin oder eine "spezielle Build-Version für Entwickler" der ausführbaren Browser-Datei? Ich liebe es, meinen Code sofort in die Konsole einzugeben, wenn ich neuen Code schreibe, also nervt mich das wirklich.
UPDATE / EDIT
Hier ist eine Teillösung, die Paul1365972 zu verdanken ist.
Sie müssen den Chrome-Browser über die Befehlszeile mit speziellen Optionen wie den folgenden starten:
- Schließen Sie Chrome vollständig
- Führen Sie Chrome von der Konsole aus, wobei
"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax"
für Windows andere Betriebssysteme ähnlich sind. - Öffnen Sie die Entwicklerkonsole und führen Sie sie aus
"%GetHeapUsage()"
. Wenn Sie Chrome mit dieser Option ordnungsgemäß gestartet haben, wird eine Nummer in der Konsole protokolliert. Andernfalls wird ein Syntaxfehler angezeigt.
Mit diesem Befehlszeilenflag können Sie mit Befehlen %
, die mit Syntaxfehlern in einfachem JavaScript beginnen, mit der V8-Engine kommunizieren. Eine Liste der verfügbaren V8-Befehle dieser Art wurde in Pauls Antwort gegeben .
Es gibt %NeverOptimizeFunction()
auf dieser Liste etwas, das so aussah, als müsste ich einfach anrufen und damit fertig sein. Leider macht diese Funktion nicht das, was ich mir erhofft hatte, wie im nächsten Screenshot gezeigt.
(((Der andere Link aus Pauls Antwort (v8-natives-Knotenmodul) ist für uns hier in diesem Zusammenhang nicht wichtig. Alles, was er tut, ist, Einzeiler um die Funktionsaufrufe "%" zu wickeln, damit der Code nicht abstürzt Browser, die nicht v8 sind.)))
(((Ich erinnere mich an eine Zeit, als dies funktionierte (als diese Optimierung noch nicht erfunden / implementiert wurde). Ich weiß nicht, wie lange es her ist. Zehn Jahre? 15 Jahre? So ähnlich. Was war die letzte Chrome-Version (wenn any) und was war die letzte Firefox-Version (hier sicherer, dass sie existiert), in der Sie etwas tun konnten? Sie erhalten nicht das Kopfgeld, aber Sie erhalten eine positive Bewertung, wenn Sie es zufällig wissen und als Antwort veröffentlichen .)))
DIE LÖSUNG
DANKE PETR SRNICEK
NEUE FRAGE
Petrs Lösung hilft zwar viel, ist aber nicht perfekt. Diese Frage wird zu lang, daher habe ich eine neue Frage gestellt, wie die Lösung von Petr verbessert werden kann. (Ich könnte diese Frage natürlich hier bearbeiten, aber das würde sich "unhistorisch" anfühlen, wenn Sie wissen, was ich meine.)
quelle
v8-natives
Bibliothek packt nur die wichtigen% -Aufrufe in Code in eine einfache Bibliothek, die sichnoops
in einem Browser oder Knoten befinden sollte, der nicht im speziellen Flag --allow-natives-syntax gestartet wurde.%NeverOptimizeFunction(foo)
ich es gerade auch für bodyOnload genannt habe, "nur weil" und dachte "gut, es wird nicht weh tun". Das Problem ist, dassfoo
es NICHT so deoptimiert wird, wie ich es mir erhofft hatte. Variablelorem
ist unsichtbar. Nehmen wir an, ich möchte einen Code schreiben, der in die Funktion foo gehen soll. Anstatt es in meinen Texteditor einzugeben, tippe ich es in die Entwicklungskonsole (während der Debugger bei foo sitzt), überprüfe, ob es das tut, was ich will, und kopiere es dann von der Konsole in meinen Texteditor. So liebe ich es zu arbeiten. Und kann nicht. Wegen der Optimierung. Kapiert?--js-flags
(einschließlich mehrerer TurboFan-bezogener ) sowie mit mehreren nativen V8-Befehlen durchgeführt, bevor Paul1365972 seine Antwort veröffentlichte, aber ich konnte das gewünschte Verhalten nicht erreichen. Ich glaube, dass dieser Ansatz eine Sackgasse sein könnte. Es kann sinnvoll sein[v8]
, dieser Frage ein Tag hinzuzufügen . Jemand mit einem tiefen Verständnis des Innenlebens von V8 kann möglicherweise klären, ob dies der richtige Weg ist, oder Sie vielleicht in die richtige Richtung weisen.Antworten:
Sie können auf alle Variablen zugreifen, indem Sie die Debugger-Anweisung in eine Auswertung wie folgt einschließen :
eval("debugger;");
. Diese hackige Lösung fügt dem Aufrufstapel jedoch eine weitere anonyme Funktion hinzu und ist offensichtlich nicht nützlich für Haltepunkte, die manuell in DevTools festgelegt werden.Dies scheint keine sehr gute Lösung zu sein, aber da es die einzige ist, die das beabsichtigte Verhalten bisher erreicht, poste ich es als Antwort.
quelle
Google Chrome verwendet die V8 JS-Engine. Sie können native Aufrufe mit dem Flag --allow-natives-syntax aktivieren. Dadurch werden viele nützliche Debugging-Funktionen (vollständige Liste hier ) wie die gesuchte angezeigt:% NeverOptimizeFunction () . Ohne dieses Flag wären diese Aufrufe eine unzulässige Syntax. Seien Sie daher bei der Bereitstellung vorsichtig (oder verwenden Sie die v8-Natives- Bibliothek).
Um diese Funktion zu aktivieren, öffnen Sie Chrome einfach mit --js-flags = "- allow-natives-syntax" (verwenden Sie dies nur zum Debuggen vertrauenswürdiger Websites, da dies nicht vertrauenswürdigem js-Code Zugriff auf Dinge gewähren kann, die Sie wirklich nicht möchten Zugang haben zu).
quelle
--allow-natives-syntax
und--js-flags="--allow-natives-syntax"
mehrere Male als "das, was ich nach 'chrome' in der Betriebssystemkonsole tippe" ausprobiert . Wenn ich das nicht alles selbst versucht hätte, würde ich auch denken, dass ein Tippfehler die wahrscheinlichste Erklärung ist. Ich habe einen weiteren Screenshot gemacht. i.stack.imgur.com/7cpPP.png Tippfehler anzeigen ? Bitte geben Sie mir eine ehrliche Antwort: Haben Sie gerade "den Artikel gelesen und verstanden" (um klar zu sein, nichts Falsches daran, wenn Sie nicht mehr behaupten), oder haben Sie das alles tatsächlich auf Ihrem Computer ausprobiert? thxIch hoffe wirklich, dass diese Frage eine WIRKLICHE Antwort hat. Was folgt, ist keine wirkliche Antwort, es ist eine Behelfslösung. Ich habe ein Hilfsprogramm geschrieben, mit dem Sie
if (false) { console.log(variables, from, closures); }
mithilfe statischer Analyse einen dummen Hilfscode des Formulars erstellen können (siehe Abbildung). Sie fügen Ihren Code ein, die dumme Anweisung wird erstellt, Sie können sie kopieren, dann brauchen Sie sie nicht um es zu tippen. Ich weiß nicht, ob das viel hilft, da all das Kopieren und Einfügen auch Zeit braucht, aber das habe ich bekommen.Geige
quelle