3

JavaScript オプティマイザにとって非常に問題となるのは、ローカル変数を変更する eval() の機能です。

本javascript Definitive Guideを読みました。

eval() は最適化できますか?? 理解できない。

4

1 に答える 1

8

最適化するのではなく、eval最適化しようとしている JavaScript エンジンがeval、文字列を受け入れ、実行する可能性のあるコードの静的分析を行うことができないため、最適化を妨げられるのです。

この関数を考えてみましょう:

function foo(str) {
    var a = getAReallyBigArray();
    doSomethingWith(a);
    document.getElementById("foo").addEventListener('click', function() {
        alert(str);
    }, false);
}

仕様によると、イベント ハンドラー関数はa(実行コンテキストのレキシカル環境オブジェクトを介して) 変数への参照を持っているため、そのイベント ハンドラーが存在する限り、配列はメモリ内に保持されます。しかし、JavaScript エンジンはイベント ハンドラーを分析し、絶対に を参照していないと判断できるためa、変数バインディング オブジェクトのコンテンツを最適化し、配列のガベージ コレクションを実行できます。

しかしeval、そこに投げます:

function foo(str) {
    var a = getAReallyBigArray();
    doSomethingWith(a);
    document.getElementById("foo").addEventListener('click', function() {
        eval(str);
    }, false);
}

現在、JavaScript エンジンがレキシカル環境オブジェクトのコンテンツを最適化することは不可能であるため、strアクセスするコードが含まれている場合に備えて、大きな配列をメモリに保持する必要があります。

それはほんの一例です。根本的なポイントはeval、JavaScript エンジンのオプティマイザの動作に非常に大きなスパナを投入し、エンジンが表示されるコードのオプティマイザを効果的にオフにすることevalです。

于 2013-03-16T09:12:43.037 に答える