0

私はjavascriptの初心者です。SA​​EFの記事を読んだことがありますが、まだ質問があります。コードは以下のとおりです。

var addEvent = (function( window, document ) {
    if ( document.addEventListener ) {
        return 関数 ( elem, タイプ, コールバック ) {
            // elem が存在し、単一ノードの場合。
            if ( elem && !elem.length || elem === ウィンドウ ) {
                elem.addEventListener( type, callback, false );
            } else if ( elem && elem.length ) { //elem は配列のノード
                for ( var i = 0; i < elem.length; i++ ) {
                    addEvent( elem[i], タイプ, コールバック );
                }
            }
        }
    } 他の場合 (document.attachEvent) {
        return 関数 ( elem, タイプ, コールバック ) {
            // elem が存在し、それが単一ノードの場合
            if ( elem && !elem.length || elem === ウィンドウ ) {
                elem.attachEvent( 'on'+タイプ、
                    関数 () {
                        callback.call( elem, window.event );
                } );
            } そうでなければ ( elem && elem.length ){
                for ( var i = 0; i < elem.length; i++ ) {
                    addEvent( elem[i], タイプ, コールバック );
                }
            }
        }
    }
})( このドキュメント );
    
私の質問は、このパラメーターとドキュメントの意味は何ですか?それらは両方とも、匿名関数に含まれるウィンドウとドキュメントのパラメーターを置き換える実際のパラメーターですか?

4

1 に答える 1

0

これは、即時関数として知られる JavaScript パターンです。次の形式を取ります。

 (function(param1, param2, ...) {
    /* ...  function body  ... */
 }(var1, var2));

無名関数の作成が含まれ、一連の変数でそれを呼び出すことは正しいです。

開発者は、変数がリークしないスコープを作成できます。JavaScript にはグローバル スコープと関数スコープしかありません。関数本体の外側で宣言された変数は、自動的にグローバル スコープに含まれます。

即時関数はその問題を回避します。

この場合、多くの場合と同様に、即時関数はクロージャー内の内部変数の一部を含むものを返します。これはそれらを保護しますが、それらの値を保護された方法で利用できるようにします。

この場合、呼び出し元がイベントを HTML 要素に追加できるようにする関数を返しています。一般に、クロスブラウザー メソッドを作成するために即時関数が使用されていることがわかります。即時関数を呼び出すと、すべてのブラウザー メソッド スニッフィングが実行され、適切なクロスブラウザー メソッドが生成されます。これは、スニッフィングが一度だけ行われることを意味します。これにより、メソッドを呼び出すたびにブラウザーをスニッフィングする必要がなくなります。

于 2012-07-06T16:26:29.683 に答える