Javascript 我可以关闭优化吗?这样闭包中的范围内变量就不会';";“优化输出”;

Javascript 我可以关闭优化吗?这样闭包中的范围内变量就不会';";“优化输出”;,javascript,google-chrome,optimization,console,v8,Javascript,Google Chrome,Optimization,Console,V8,作为现代浏览器进行代码优化的副产品,在调试时,您无法“看到”所有“事实上”在范围内的变量。这是众所周知的,并已在一份报告中加以说明。虽然这个特性在生产中非常有用,但在开发过程中会让我非常恼火,但它会减慢我的速度(这应该是显而易见的) 现在我的问题是,有没有办法关闭这种行为?我是否可以编辑一些配置文件,或者是否有浏览器插件,或者是否有浏览器可执行文件的“针对开发人员的特殊构建版本”?我喜欢在编写新代码时立即在控制台中键入代码,所以这真的让我很烦 更新/编辑 这是一个部分解决方案,归功于Paul1

作为现代浏览器进行代码优化的副产品,在调试时,您无法“看到”所有“事实上”在范围内的变量。这是众所周知的,并已在一份报告中加以说明。虽然这个特性在生产中非常有用,但在开发过程中会让我非常恼火,但它会减慢我的速度(这应该是显而易见的)

现在我的问题是,有没有办法关闭这种行为?我是否可以编辑一些配置文件,或者是否有浏览器插件,或者是否有浏览器可执行文件的“针对开发人员的特殊构建版本”?我喜欢在编写新代码时立即在控制台中键入代码,所以这真的让我很烦

更新/编辑

这是一个部分解决方案,归功于Paul1365972

您必须从命令行启动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版本是什么(这里更确定它存在)你能做什么呢?它不会给你奖金,但如果你碰巧知道并将其作为答案发布,它会给你一张选票。)

    解决方案

    谢谢PETR SRNICEK

    新问题


    虽然彼得的解决方案帮助很大,但它并不完美。这个问题太长了,所以我发布了一篇关于如何改进Petr的解决方案的文章。(我当然可以在这里编辑这个问题,但如果你知道我的意思,那会让人觉得“没有历史感”。

    我真的希望这个问题有一个真实的答案。接下来的不是真正的答案,只是权宜之计。我编写了一个助手工具,您可以使用它创建愚蠢的助手代码,其形式为
    if(false){console.log(variables,from,closures);}
    (请参见相关屏幕截图),使用静态分析-粘贴代码,创建愚蠢的语句,您可以复制它,然后无需键入它。我不知道这是否有很大帮助,因为所有这些复制和粘贴也需要时间,但这就是我得到的


    Google Chrome使用V8 JS引擎,您可以使用--allow natives语法标志启用对它的本机调用,这将公开许多有用的调试函数(完整列表),如您正在寻找的:%NeverOptimizeFunction()。如果没有此标志,这些调用将是非法语法,因此在部署(或使用库)时要小心


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

    您可以通过将调试器语句包装在一个eval中来访问所有变量,如下所示:
    eval(“debugger;”;
    。这个黑客解决方案在调用堆栈中添加了另一个匿名函数,显然对于在DevTools中手动设置的断点没有任何用处


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

    意外后果,第十章和第一章。这种优化对我的编码风格有负面影响。我发现自己使用了老式的for循环(而不是.map、.forEach、.reduce)为了避免遇到这个问题,
    v8 natives
    库只是将代码中重要的%调用封装在一个简单的库中,该库应该是
    noops
    中的浏览器或节点,而不是在特殊的--allow natives语法标志中启动。我运行了一些测试,“bodyOnLoad”函数没有优化总之,使用内部命令来尝试并强制它去优化并没有任何作用。@Nathanel:重要的调用是
    %NeverOptimizeFunction(foo)
    我刚才也为bodyOnload调用了它,“仅仅因为”,认为“好吧,它不会有什么坏处”问题是,
    foo
    并没有像我希望的那样去优化。变量
    lorem
    不可见。假设我想写一些代码,进入函数foo。我没有将它输入到我的文本编辑器中,而是将它输入到开发人员控制台中(调试器在foo中),查看它是否执行了我想要的操作,然后将它从控制台复制/粘贴到我的文本编辑器中。这就是我喜欢工作的原因。而且不能。因为优化。明白了吗?在Paul1365972发布答案之前,我花了好几天时间试验各种
    --js标志(包括几个相关的标志)以及几个V8本机命令,但我没有达到预期的效果。我认为这种做法可能是一条死胡同。可能是