(这是一个有点 X-Y 的问题,但我决定问我感兴趣的问题,而不是我目前严格需要的问题。)我知道各种现代 JavaScript 引擎都有死代码消除器和其他方法摆脱没有效果或副作用的代码,但您如何识别和/或编写此类代码?
Wikipedia article on Dead code elimination给出了一个无法访问代码的简单示例,即函数中无条件 return
语句之后发生的代码。但是我能指望现代的、主要的 JavaScript 引擎来消除这样的代码吗?比如Rhino或者V8会不会去掉这段代码?
function (foo) {
return;
return foo;
}
function (foo) {
foo = foo;
}
没有操作函数怎么办?
(function () {}(foo));
jQuery.noop(foo);
所有这些例子都骗过了 JSHint,虽然 JSLint 捕获了奇怪的赋值 foo = foo
,你仍然可以很容易地用 noops 或一对变量来欺骗它:
function (foo) {
var bar = foo;
}
如果他们可以欺骗静态代码分析器,他们会欺骗引擎本身吗?
如果不仔细检查所有不同 JavaScript 引擎的源代码,是否有任何方法可以识别和/或构造在程序运行之前肯定会被删除的代码类型,如果出现以下情况,是否应将其视为错误这样的代码并没有被省略,还是仅仅是一种设计选择?
最佳答案
在 JavaScript 中查找死代码与在其他语言(如 C++)中查找死代码完全不同。例如,您可以编译 C++ 来检测无法访问的代码,但显然这对于 JavaScript 是不可能的。
您给出的死代码示例 function () { return;变种富= 1; }
发生的可能性远低于分配给页面上不再存在的 HTML 元素的事件处理程序。没有自动死代码分析器可以检测到后者。
你可以做的是使用 code coverage tool在您的测试运行期间并查找未使用的行。您只需确保您的测试脚本非常全面。
关于javascript - JavaScript 引擎可能会忽略什么样的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14410097/