JavaScript関数の不活性読み込み

6324 ワード

最近JavaScriptの高級なプログラムの設計を見て、大いに収穫があって、次の数日読書のノートを書きます.以前にAjaxの初歩的な理解のエッセイを書いたが、XmlHttpRequestオブジェクトを作成するための関数があり、ブラウザの互換性の原因で書かれたコードはif判断やtry、catch文を通じて関数を正しいコードに導く.
<script type="text/javascript">
            function createXHR(){
                var xhr = null;
                try {
                    // Firefox, Opera 8.0+, Safari,IE7+
                    xhr = new XMLHttpRequest();
                }
                catch (e) {
                    // Internet Explorer 
                    try {
                        xhr = new ActiveXObject("Msxml2.XMLHTTP");
                    }
                    catch (e) {
                        try {
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (e) {
                            xhr = null;
                        }
                    }
                }
                return xhr;
            }
        </script>

この関数を呼び出すたびに、まずブラウザのコンピテンシーチェックを行います.まず、ブラウザが内蔵のXMLHypRequestオブジェクトをサポートしているかどうかを確認します.サポートされていない場合は、ActiveXベースのXMLHttpRequestをチェックします.この関数を呼び出すたびにそうです.実際には、最初の実行が完了した後、ブラウザが特定のXMLttpRequestオブジェクトをサポートしている場合は、次の実行時にこのようなサポートは変更されず、検出しながら行う必要はありません.if文が1つでもないよりも実行が遅くなるに違いありません.if文を毎回実行する必要がなければ、頻繁に呼び出す場合に実行速度を向上させることができます.ソリューションは、不活性ロードと呼ばれるテクニックです.
ふかっせいふか
不活性ロードは、関数の実行を表すブランチが関数が最初に無効になったときにのみ実行され、最初の呼び出しの過程で、この関数は別の適切な方法で実行される関数として上書きされ、元の関数に対する呼び出しが実行されないブランチになります.createXHR関数はこのように書き換えることができます.
function createXHR(){
                var xhr=null;
                if(typeof XMLHttpRequest !='undefined'){
                    xhr = new XMLHttpRequest();
                    createXHR=function(){
                        return new XMLHttpRequest();
                    }
                }else{
                    try {
                        xhr = new ActiveXObject("Msxml2.XMLHTTP");
                        createXHR=function(){
                            return new ActiveXObject("Msxml2.XMLHTTP");
                        }
                    }
                    catch (e) {
                        try {
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                            createXHR=function(){
                                return new ActiveXObject("Microsoft.XMLHTTP");
                            }
                        }
                        catch (e) {
                            createXHR=function(){
                                return null;
                            }
                        }
                    }
                }
                return xhr;
            }

この不活性にロードされたcreateXHRで最初に実行されると、各ブランチはcreateXHRに値を再割り当て、元の関数を上書きしてxhrオブジェクトを返し、2回目の実行時に書き換えた関数を直接呼び出し、ブランチごとに再検出する必要がなくなります.
メリット
不活性ロード関数には2つの主要な利点があり、1つ目は明らかな効率の問題であり、1回目の実行時に関数が付与値を意味して実行するのが遅いが、後続の呼び出しは回避された重複検出が速いためである.2つ目は、実行する適切なコードが実際に関数を呼び出す場合にのみ実行され、多くのJavaScriptライブラリがロードされるとブラウザによって多くのブランチが実行され、すべてのものを実装して設定され、不活性なロード関数は初期スクリプトの実行時間に影響を与えない遅延を計算します.