什么样的代码是JavaScript引擎可能会消失?

(这是一个XY问题,但我决定提出我感兴趣的问题,而不是我目前非常需要的问题.)我知道各种现代
JavaScript引擎都有死代码消除器和其他方法来摆脱代码没有任何影响或副作用,但您如何识别和/或撰写此类代码?

Wikipedia article on Dead code elimination提供了一个直接无法访问的代码示例,即在函数中无条件返回语句之后发生的代码.但是,我可以依靠现代的主要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; var foo = 1;与分配给页面上不再存在的HTML元素的事件处理程序相比,发生的可能性要小得多.没有自动死代码分析器可以检测后者.

您可以做的是在测试运行期间使用code coverage tool并查找未使用的行.您只需确保您的测试脚本非常彻底.

点赞