我可以关闭优化吗​​,所以闭包中的范围内变量不会被“优化”


11

作为现代浏览器完成代码优化的副产品,在调试时,您无法“看到”“实际上”在范围内的所有变量。这是众所周知的,并且已经在SO上的上一个问题中得到了解决。此功能虽然在生产中最肯定有用,但在开发过程中却使我很烦,但它会使我放慢速度(这很明显)。

现在我的问题是,有什么办法可以关闭这种行为?我可以编辑一些配置文件,还是有浏览器插件,或者有浏览器可执行文件的“开发人员专用构建版本”?我喜欢在编写新代码时立即在控制台中输入代码,所以这确实困扰了我。

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中的语法错误。Paul的答案中列出了可用的此类V8命令。

%NeverOptimizeFunction()该列表,这是一些东西,看起来像的东西我只需要调用,并用它做的。不幸的是,该功能没有实现我所希望的,如下面的屏幕快照所示。

lorem仍未定义

(((在保罗的回答其他链接(V8本地人节点模块)并不那么重要,对我们这里在这种情况下,它所做的就是它环绕的“%”功能调用单行这样的代码不会崩溃不是v8的浏览器。)))

((((((我记得有一次它是在那时(尚未发明/实现这种优化)。我不知道多久。十年?十五年?类似的东西。最后一个Chrome版本是什么(如果任何)以及您可以做什么的最后一个Firefox版本(请确保在此存在)是什么?如果您碰巧知道并将其发布为答案,它不会给您带来悬赏,但会给您带来赞誉。 。)))

解决方案

谢谢彼得·斯尼科克

修补程序

新问题

虽然Petr的解决方案有很大帮助,但这并不完美。这个问题太长了,所以我发布了一个新的问题,关于如何改进Petr的解决方案。(我当然可以在这里编辑此问题,但是,如果您了解我的意思,那将感到“不历史”。)


意想不到的后果,一万册。这种优化对我的编码风格有负面影响。我发现自己比其他方式更多地使用老式的for循环(而不是.map,.forEach,.reduce),以免避免遇到此问题。
mathheadinclouds

v8-natives库只是将重要的%调用代码包装在一个简单的库中,该库应noops位于未在特殊--allow-natives-syntax标志中启动的浏览器或节点中。–
Nathanael

我进行了一些测试,但“ bodyOnLoad”功能并未得到优化。因此,使用内部命令尝试强制其取消优化并没有任何作用。
Nathanael

@Nathanael:重要的呼叫是%NeverOptimizeFunction(foo)我也为bodyOnload称呼它,“只是因为”,以为“很好,不会受伤”。问题是foo并没有按照我希望的方式进行优化。变量lorem是不可见的。假设我要编写一些要进入函数foo的代码。我没有将其输入文本编辑器,而是将其输入开发控制台(调试器位于foo时),查看它是否满足我的要求,然后将其从控制台复制/粘贴到我的文本编辑器中。那就是我喜欢工作的方式。而且不能。因为优化。得到它?
mathheadinclouds

1
在Paul1365972发布他的答案之前,我花了几个实验来尝试各种命令--js-flags(包括与TurboFan相关的几个命令)以及多个V8本机命令,但是我无法实现所需的性能。我认为这种方法可能是死路一条。[v8]为这个问题添加标签可能是值得的。深入了解V8内部工作原理的人也许可以弄清楚这是否是正确的方法,或者可以为您指明正确的方向。
PetrSrníček19年

Answers:


2

您可以通过包装在这样一个eval调试程序语句可以访问所有的变量:eval("debugger;");。这个骇人的解决方案虽然在调用堆栈中添加了另一个匿名函数,但是对于在DevTools中手动设置的断点,它显然没有用。

这似乎不是一个很好的解决方案,但是由于它是迄今为止唯一实现预期行为的解决方案,因此我将其发布为答案。


这让我感到惊讶。您知道,我尝试键入eval(“ lorem”),并且给出了相同的“ lorem not defined”错误。对我来说,在控制台上输入eval(“ lorem”)(在foo函数中的调试器语句中)应该做的事情与eval(“ debugger”)所做的事情没有什么不同-期望打印“ ipsum”到控制台。但是它们是完全不同的。奇怪。
mathheadinclouds

这是一个有趣的工作。这有点hacky,因为您不能退出调试器语句(只需手动切换到源文件),否则您将丢失整个堆栈并返回到调用eval的函数。使您减少的堆栈缺少其他上下文。
Nathanael

可以这样修改该技巧:代替eval(“ debugger”),仅放置eval(“”)-但是其中许多都分布在代码中,到您认为可能需要“扩展断点”的任何地方。然后,您可以使用开发工具在这些eval('')语句之一所在的位置设置一个断点,并在此位置停下来,然后“进入”。我正在考虑编写一个小编译器(对于我正在做的一件小事,用大字眼)将这些语句放在每个函数的开头。stackoverflow.com/questions/59159996/…–
mathheadinclouds

我只是尝试用eval()替换eval(“ debugger”); 调试器,并得到不同的结果,具体取决于firefox或chrome的用法。i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome使用V8 JS-Engine,您可以使用--allow-natives-syntax标志启用对它的本机调用,这将公开许多有用的调试功能(此处为完整列表),例如您要查找的功能:%NeverOptimizeFunction() 。没有此标志,这些调用将是非法语法,因此在部署(或使用v8-Natives库)时要小心。

要启用此功能,只需使用--js-flags =“-allow-natives-syntax”打开chrome(仅用于调试受信任的网站,因为这可以使不受信任的js代码访问您确实不想要的东西可使用)。


谢谢。请阅读我更新的问题。您似乎很可能已在此处找到解决方案,但我需要进一步澄清以使其继续进行。如果这有效,那么您当然应该得到赏金。
mathheadinclouds

tl; dr改用--js-flags =“-allow-natives-syntax”。要启用该功能,需要使用--allow-natives-syntax标志启动V8 JS-Engine,但是您不能直接启动它,这是Chrome作业。因此,您必须告诉chrome使用标志启动引擎,您该怎么做?只需通过--js-flags = <此处的您的标志>将所提到的引擎标志传递给chrome。
Paul1365972 '19

不。请再尝试一次,以确保安全。我曾经尝试都--allow-natives-syntax--js-flags="--allow-natives-syntax"多次为“在操作系统控制台‘铬’后的事情我型”。如果我自己没有尝试过所有这些,我也认为错别字是最可能的解释。我做了另一个截图。i.stack.imgur.com/7cpPP.png看到错字了吗?请给我一个诚实的答案:您是否只是“阅读并理解了这篇文章”(要清楚,如果您不要求更多,就没有什么错),或者您实际上在计算机上尝试了所有这些内容吗?thx
mathheadinclouds19年

只是一个猜测:可能是我没有使用该选项启动chrome可执行文件,而是使用该选项编译了chrome C ++(或其他)源代码
mathheadinclouds

1
太奇怪了,我刚刚对其进行了测试,并且工作正常,无需编译。我只会写我所做的事情,所以不会产生误解。1.完全关闭Chrome。2.使用“ C:/ Program Files(x86)/Google/Chrome/Application/chrome.exe” --js-flags =“-allow-natives-syntax”从控制台运行Chrome。3.打开开发人员控制台并执行“%GetHeapUsage()”以测试一切是否正常
Paul1365972

0

我真的希望这个问题有一个真实的答案。随之而来的不是一个真正的答案,而是一个临时的。我写了一个帮助程序工具,您可以使用它if (false) { console.log(variables, from, closures); }通过静态分析来创建表单的愚蠢帮助程序代码(请参阅有问题的屏幕截图)-您可以粘贴代码,创建愚蠢的语句,可以复制它,然后就不需要了键入。我不知道这是否有很大帮助,因为所有这些复制和粘贴操作也需要时间,但这就是我得到的。

屏幕截图

小提琴

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.