javascript - JavaScript 引擎可能会忽略什么样的代码?

标签 javascript code-coverage static-analysis compiler-theory dead-code

(这是一个有点 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/

相关文章:

intellij-idea - IntelliJ 代码覆盖率 : how to know which unit tests covered lines in source code

rust - 如何在函数调用时显示编译器警告?

python - Pylint 误报 E1101 : Instance of 'Popen' has no 'poll' member

javascript - 如何从 Blade 模板中的 Javascript 文件重定向 Laravel 路由

javascript - 按标签/类名长度选择元素

Python 覆盖率徽章,如何获得?

report - 艾玛代码覆盖率报告

c++ - 什么时候初始化全局静态常量变量?

JavaScript 检查是否尚未使用随机数

javascript - Node.js 文件系统 : Promise once read all files