0

https://github.com/Khan/khan-exercises/blob/master/khan-exercise.jsのコードは 次のとおりです。

for ( var i = 0; i < loading; i++ ) (function( mod ) {
    if ( !testMode && mod.src.indexOf("/khan-exercises/") === 0 && mod.src.indexOf("/MathJax/") === -1 ) {
        // Don't bother loading khan-exercises content in production
        // mode, this content is already packaged up and available
        // (*unless* it's MathJax, which is silly still needs to be loaded)
        loaded++;
        return;
    }

    // Adapted from jQuery getScript (ajax/script.js)
    var script = document.createElement("script");
    script.async = "async";

    for ( var prop in mod ) {
        script[ prop ] = mod[ prop ];
    }

    script.onerror = function() {
        // No error in IE, but this is mostly for debugging during development so it's probably okay
        // http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer
        Khan.error( "Error loading script " + script.src );
    };

    script.onload = script.onreadystatechange = function() {
        if ( !script.readyState || ( /loaded|complete/ ).test( script.readyState ) ) {
            // Handle memory leak in IE
            script.onload = script.onreadystatechange = null;

            // Remove the script
            if ( script.parentNode ) {
                script.parentNode.removeChild( script );
            }

            // Dereference the script
            script = undefined;

            runCallback();
        }
    };

    head.appendChild(script);
})( urls[i] );

奇妙なこと: 通常の for ループ コード ブロックの代わりに、自己呼び出し関数が表示されます!(他の自己呼び出し関数の内部) それはなぜですか? この機能はどのように実行されますか?

4

2 に答える 2

3

基本的に、パラメーターに渡されたfor loop値を使用して毎回関数を実行します。url[i]mod

for ( var i = 0; i < loading; i++ ) (function( mod ) {...The code...})(urls[i]);

コードで気付いた場合、これが表示されます

(function( mod ) {...The code...})(urls[i])

urls[i] これは、パラメーターに渡す関数呼び出しですmod

于 2011-09-23T19:49:30.617 に答える
1

これは奇妙な構造ですが、基本的に for ループから を除外すると{}、反復ごとに次の行が実行されるだけです。{}ifif

したがって、基本的にこれと同等です:

function doSomething(){...}

for ( var i = 0; i < loading; i++ ) {
   doSomething(urls[i]);
}

doSomething はその大きな関数です。

于 2011-09-23T19:51:02.980 に答える