Зачем использовать самозапускающуюся анонимную функцию при получении пути к сценарию

Я обнаружил, что люди используют этот метод, чтобы получить путь к текущему местоположению скрипта:

    _getScriptLocation: (function() {
        var r = new RegExp("(^|(.*?\\/))(" + scriptName + ")(\\?|$)"),
            s = document.getElementsByTagName('script'),
            src, m, l = "";
        for(var i=0, len=s.length; i<len; i++) {
            src = s[i].getAttribute('src');
            if(src) {
                m = src.match(r);
                if(m) {
                    l = m[1];
                    break;
                }
            }
        }
        return (function() { return l; });
    })(),

Полные коды здесь.

Но я не знаю, почему он использует самозапускающуюся анонимную функцию?

Почему бы не использовать это вместо:

_getScriptLocation: function() {
    var r = new RegExp("(^|(.*?\\/))(" + scriptName + ")(\\?|$)"),
        s = document.getElementsByTagName('script'),
        src, m, l = "";
    for(var i=0, len=s.length; i<len; i++) {
        src = s[i].getAttribute('src');
        if(src) {
            m = src.match(r);
            if(m) {
                l = m[1];
                break;
            }
        }
    }
    return l;
}

3 ответа

Решение

В первом (функция, выполняющаяся самостоятельно) процесс функции выполняется только один раз, поэтому:

APP._getScriptLocation();
APP._getScriptLocation();
APP._getScriptLocation();

просто возвращает l для каждого вызова (процесс никогда не будет выполняться снова - он просто выполняется после загрузки скрипта: потому что это была функция, выполняемая самостоятельно).

Но во втором случае, когда вы вызываете свой метод:

APP._getScriptLocation();

Вы выполняете весь процесс снова и снова, который не нужен в этом случае.

Первый создает анонимную функцию, которая просто возвращает местоположение текущего скрипта. Местоположение вычисляется только один раз и является статической строкой, возвращаемой функцией.

Второй пересчитывает местоположение каждый раз, когда вы звоните. Хотя они дают одинаковые результаты, второй будет намного медленнее первого, который на самом деле просто return заявление.

Из-за области действия, делая это, вы не создаете другую функцию, которая останется в глобальной области. Если вы создали функцию с именем, она останется объектом в глобальном контексте, плюс вам нужно будет вызвать ее. Здесь есть хорошее чтение. http://helephant.com/2008/08/23/javascript-anonymous-functions/.

Другие вопросы по тегам