(这有点像X-Y问题,但我决定问我感兴趣的问题,而不是我目前严格需要的问题。)我知道各种现代JavaScript引擎都有死代码消除器和其他方法来摆脱没有效果或副作用的代码,但是如何识别和/或编写这样的代码呢?
维基百科关于消除死代码的文章给出了一个不可访问代码的简单示例,即函数中无条件return
语句之后的代码。但是我能指望现代的主流JavaScript引擎消除这样的代码吗?例如,Rhino或V8会消除这些代码吗?
function (foo) {
return;
return foo;
}
function (foo) {
foo = foo;
}
,如果没有op函数呢?
(function () {}(foo));
jQuery.noop(foo);
所有这些例子都欺骗了JSHint,当JSLint捕获奇怪的赋值 foo = foo
时,你仍然可以很容易地用noops或一对变量欺骗它:
function (foo) {
var bar = foo;
}
如果他们可以欺骗静态代码分析器,他们会欺骗引擎本身吗?
如果不仔细检查所有不同JavaScript引擎的源代码,是否有任何方法可以识别和/或构建在程序运行之前肯定会被消除的代码类型,如果这样的代码没有被省略,它是否应该被认为是一个bug,或者它仅仅是一个设计选择?
在JavaScript中查找死代码与在其他语言(如c++)中查找死代码是不同的。例如,您可以编译c++来检测无法访问的代码,但显然这对于JavaScript是不可能的。
你给function () { return; var foo = 1; }
的死代码的例子是远不太可能发生的事件处理程序分配给一个HTML元素,不再存在于页面上。没有自动的死码分析器可以检测到后者。
您可以做的是在测试运行期间使用代码覆盖工具并查找未使用的行。您只需要确保您的测试脚本是非常彻底的。