4

(これはちょっとした XY 問題ですが、現時点で厳密に必要な質問ではなく、興味のある質問をすることにしました。) さまざまな最新の 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 エンジンのソースを綿密に調べる以外に、プログラムが実行される前に確実に削除される種類のコードを特定および/または構築する方法はありますか?省略されていませんか、それとも単なる設計上の選択ですか?

4

1 に答える 1

2

JavaScript でデッド コードを見つけることは、C++ などの他の言語でデッド コードを見つけることとは異なります。たとえば、到達不能なコードを検出するために C++ をコンパイルできますが、明らかに JavaScript では不可能です。

あなたが示したデッド コードの例はfunction () { return; var foo = 1; }、ページ上に存在しなくなった HTML 要素に割り当てられたイベント ハンドラーよりも発生する可能性がはるかに低くなります。自動化されたデッド コード アナライザーは後者を検出できませんでした。

できることは、テストの実行中にコード カバレッジ ツールを使用して、未使用の行を探すことです。テストスクリプトが非常に完全であることを確認する必要があります.

于 2013-01-19T01:14:41.690 に答える