4

(这有点 XY 问题,但我决定问我感兴趣的问题,而不是我目前严格需要的问题。)我知道各种现代 JavaScript 引擎都有死代码消除器和其他方法来摆脱没有效果或副作用的代码,但是您如何识别和/或编写此类代码?

关于死代码消除的Wikipedia 文章给出了一个无法访问代码的简单示例,即发生在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 引擎的源代码,是否有任何方法可以识别和/或构建在程序运行之前肯定会被消除的代码类型,如果这样的代码是没有被忽略,还是仅仅是一种设计选择?

4

1 回答 1

2

在 JavaScript 中查找死代码与在 C++ 等其他语言中查找死代码不同。例如,您可以编译 C++ 来检测无法访问的代码,但显然这对于​​ JavaScript 是不可能的。

function () { return; var foo = 1; }与分配给页面上不再存在的 HTML 元素的事件处理程序相比,您给出的死代码示例发生的可能性要小得多。没有自动死代码分析器可以检测到后者。

您可以做的是在测试运行期间使用代码覆盖工具并查找未使用的行。您只需要确保您的测试脚本非常彻底。

于 2013-01-19T01:14:41.690 回答