我可以关闭优化吗,所以来自闭包的范围内变量不是 "optimized out"
can I turn off optimization, so in-scope variables from closures aren't "optimized out"
作为现代浏览器代码优化的副产品,在调试时,您不能 "see" "factually" 范围内的所有变量。这是众所周知的,并且已在 中得到解决。这个功能,虽然在生产中最有用,但在开发过程中让我很烦,它让我慢下来(这应该是显而易见的。)
现在我的问题是,有什么办法可以关闭此行为吗?我可以编辑一些配置文件吗,或者是否有浏览器插件,或者是否有浏览器可执行文件的 "special build version for developers"?我喜欢在编写新代码时立即将代码输入控制台,所以这真的很烦我。
更新/编辑
这是部分解决方案,感谢 Paul1365972。
您必须使用特殊选项从命令行启动 chrome 浏览器,例如:
- 完全关闭Chrome
- 运行 Chrome 从控制台
"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax"
那是 windows 其他 OS 相似的。
- 打开开发者控制台并执行
"%GetHeapUsage()"
。如果您使用该选项正确启动 Chrome,一个数字将记录到控制台,否则您将收到语法错误。
使用此命令行标志,您可以 'talk to the V8' 引擎使用以 %
开头的命令,这些命令在普通 JavaScript 中是语法错误。此类可用 V8 命令的列表是 given in Paul's answer.
该列表中有 %NeverOptimizeFunction()
,这看起来像是我必须调用并完成它的东西。不幸的是,该功能并没有达到我的期望,如下一个屏幕截图所示。
(((other link from Paul's answer(v8-natives 节点模块)在此上下文中对我们来说并不重要。它所做的只是将一行代码包裹在“%”函数调用周围,因此代码不会使非 v8 的浏览器崩溃。)))
(((我记得有一次它起作用了(当时这个优化还没有invented/implemented)。我不知道是多久以前的事了。十年?15 年?类似的东西。什么是最后一个 Chrome 版本(如果有的话),最后一个 firefox 版本是什么(在这里更确定它存在)你可以在哪里做?它不会让你得到赏金,但它会让你得到一个赞成票,如果您碰巧知道并且 post 它作为答案。)))
解决方案
谢谢你 PETR SRNICEK
新问题
虽然 Petr 的解决方案很有帮助,但并不完美。这个问题太长了,所以我 post 编辑了 new question 关于如何改进 Petr 的解决方案。 (我当然可以在这里编辑这个问题,但如果你明白我的意思的话,那会感觉 "unhistorical"。)
我真的希望这个问题有一个真正的答案。接下来的内容不是真正的答案,而是权宜之计。我写了一个帮助工具,你可以使用静态分析创建 if (false) { console.log(variables, from, closures); }
形式的愚蠢的帮助代码(见问题的屏幕截图) - 你粘贴你的代码,创建愚蠢的语句,你可以复制它,然后你不需要输入它。我不知道这是否有很大帮助,因为所有这些复制和粘贴也需要时间,但这就是我得到的。
Google Chrome 使用 V8 JS 引擎,您可以使用 --allow-natives-syntax 标志启用对它的本地调用,这会公开许多有用的调试功能(完整列表 here) like the one you are looking for: %NeverOptimizeFunction(). Without this flag, these calls would be illegal syntax so be careful when deploying (or use the v8-Natives图书馆)。
要启用此功能,只需使用 --js-flags="--allow-natives-syntax" 打开 chrome(仅用于调试受信任的网站,因为这可以提供不受信任的 js 代码访问权限到你真的不希望它访问的东西)。
您可以通过将调试器语句包装在 eval 中来访问所有变量,如下所示:eval("debugger;");
。这个 hacky 解决方案虽然向调用堆栈添加了另一个匿名函数,但显然对于在 DevTools 中手动设置的断点没有用。
这似乎不是一个很好的解决方案,但由于它是迄今为止唯一实现预期行为的解决方案,我将其作为答案发布。
作为现代浏览器代码优化的副产品,在调试时,您不能 "see" "factually" 范围内的所有变量。这是众所周知的,并且已在
现在我的问题是,有什么办法可以关闭此行为吗?我可以编辑一些配置文件吗,或者是否有浏览器插件,或者是否有浏览器可执行文件的 "special build version for developers"?我喜欢在编写新代码时立即将代码输入控制台,所以这真的很烦我。
更新/编辑
这是部分解决方案,感谢 Paul1365972。
您必须使用特殊选项从命令行启动 chrome 浏览器,例如:
- 完全关闭Chrome
- 运行 Chrome 从控制台
"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax"
那是 windows 其他 OS 相似的。 - 打开开发者控制台并执行
"%GetHeapUsage()"
。如果您使用该选项正确启动 Chrome,一个数字将记录到控制台,否则您将收到语法错误。
使用此命令行标志,您可以 'talk to the V8' 引擎使用以 %
开头的命令,这些命令在普通 JavaScript 中是语法错误。此类可用 V8 命令的列表是 given in Paul's answer.
该列表中有 %NeverOptimizeFunction()
,这看起来像是我必须调用并完成它的东西。不幸的是,该功能并没有达到我的期望,如下一个屏幕截图所示。
(((other link from Paul's answer(v8-natives 节点模块)在此上下文中对我们来说并不重要。它所做的只是将一行代码包裹在“%”函数调用周围,因此代码不会使非 v8 的浏览器崩溃。)))
(((我记得有一次它起作用了(当时这个优化还没有invented/implemented)。我不知道是多久以前的事了。十年?15 年?类似的东西。什么是最后一个 Chrome 版本(如果有的话),最后一个 firefox 版本是什么(在这里更确定它存在)你可以在哪里做?它不会让你得到赏金,但它会让你得到一个赞成票,如果您碰巧知道并且 post 它作为答案。)))
解决方案
谢谢你 PETR SRNICEK
新问题
虽然 Petr 的解决方案很有帮助,但并不完美。这个问题太长了,所以我 post 编辑了 new question 关于如何改进 Petr 的解决方案。 (我当然可以在这里编辑这个问题,但如果你明白我的意思的话,那会感觉 "unhistorical"。)
我真的希望这个问题有一个真正的答案。接下来的内容不是真正的答案,而是权宜之计。我写了一个帮助工具,你可以使用静态分析创建 if (false) { console.log(variables, from, closures); }
形式的愚蠢的帮助代码(见问题的屏幕截图) - 你粘贴你的代码,创建愚蠢的语句,你可以复制它,然后你不需要输入它。我不知道这是否有很大帮助,因为所有这些复制和粘贴也需要时间,但这就是我得到的。
Google Chrome 使用 V8 JS 引擎,您可以使用 --allow-natives-syntax 标志启用对它的本地调用,这会公开许多有用的调试功能(完整列表 here) like the one you are looking for: %NeverOptimizeFunction(). Without this flag, these calls would be illegal syntax so be careful when deploying (or use the v8-Natives图书馆)。
要启用此功能,只需使用 --js-flags="--allow-natives-syntax" 打开 chrome(仅用于调试受信任的网站,因为这可以提供不受信任的 js 代码访问权限到你真的不希望它访问的东西)。
您可以通过将调试器语句包装在 eval 中来访问所有变量,如下所示:eval("debugger;");
。这个 hacky 解决方案虽然向调用堆栈添加了另一个匿名函数,但显然对于在 DevTools 中手动设置的断点没有用。
这似乎不是一个很好的解决方案,但由于它是迄今为止唯一实现预期行为的解决方案,我将其作为答案发布。