функция самовоспроизведения в цикле for - PullRequest
0 голосов
/ 23 сентября 2011

Вот код из 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
        // /1659847/kak-vyzvat-script-onerror-v-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] );

Странная вещь: вместо обычного для блока кода цикла мы видим самозапускающуюся функцию! (Внутри другой самозапускающей функции) Почему это так?как будет работать эта функция?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Обычно 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

1 голос
/ 23 сентября 2011

Это нечетная конструкция, но, по сути, если вы исключите {} из цикла for, он просто будет запускать следующую строку для каждой итерации, это похоже на исключение {} с if, если вы хотите линия if.

Так что это в основном эквивалентно этому:

function doSomething(){...}

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

Где doSomething - это большая функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...