Альтернативный способ определения объекта?Объект буквально работает, но имеет избыточность - PullRequest
0 голосов
/ 03 сентября 2011

Хорошо, поэтому я сделал себе небольшой объект для оценки всего загружаемого jquery с помощью резервного средства (и использовал его для загрузки всех моих js-файлов, в действительности), используя JSON:

<script type="text/javascript">

/* Library loading object */

var ScriptLoader = {
    //values
    head_tag : document.getElementsByTagName('head')[0],
    fallback : false,

    //functions
    createScript: function(script_path) {
        var script_tag = document.createElement('script');
        script_tag.type = 'text/javascript';
        script_tag.src = script_path;
        return script_tag;
    },

    addToHead : function(tag) {
        ScriptLoader.head_tag.appendChild(tag);
    },

    addLoadEvent : function(func) {
        var prev = window.onload;

        if (typeof window.onload !== 'function') {
            window.onload = func;
        } else {
            window.onload = function() {
                prev();
                func();
            }
        }
    }
};


//Loading jquery, modernizr, and my js files when window is ready.

ScriptLoader.addLoadEvent(function() {
    /* Load from jquery's cdn for speed + auto latest download */
    var scripts = ['http://code.jquery.com/jquery-latest.min.js',
        'scripts/modernizr.js',
        'scripts/script.js'],
            idx = 0;
    for (; idx < scripts.length; idx++) {
        ScriptLoader.addToHead(ScriptLoader.createScript(scripts[idx]));
    }
});

//jquery fallback
ScriptLoader.addLoadEvent(function() {
    if (typeof window.jQuery === undefined) {
        ScriptLoader.fallback = true;
        ScriptLoader.addToHead(ScriptLoader.createScript('scripts/jquery-mini-1.6.2.js'));
    }
});

//grab info
(function() {
    setTimeout(function() {
        console.log('jquery loaded: ' + (window.jQuery !== undefined));
        console.log('used fallback: ' + ScriptLoader.fallback);
    }, 1000);
})();

Прямо сейчас, это полностью работает, но замечаете постоянные обращения к имени моего объекта?Есть ли способ просто использовать этот вместо этого?Я как бы получаю всю область действия функционального уровня, а также понимаю, что это присваивается ближайшей включающей функции, но я не совсем ясен по этому поводу.

Я также кратко читаю, но не понимаюне полностью понимаю замыкания ..

Спасибо:)

1 Ответ

0 голосов
/ 03 сентября 2011

Нет, поскольку this относится к экземпляру объекта, а не к шаблону объекта.

Замыкания - это просто возвращаемые функции изнутри функций, которые затем можно назначать новым переменным и выполнять, как если бы они были родительскими функциями. Замыкание сохраняет область действия своего исходного родительского функции, даже если оно не упоминается в новом назначении. Вот почему замыкания подвержены утечкам памяти, потому что сборщик мусора в ECMAScript не имеет объема назначений замыканий.

function foo(a,b){
  var c = 1;
  return function(c){
    return a + b + c;
  }
}

var bar = foo(3,5); // bar is now a closure

alert(bar(2)); // 10
...