Показать сообщение отдельно
  #16 (permalink)  
Старый 21.12.2011, 15:42
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Livanderiaamarum Посмотреть сообщение
это и запарывает функцию по имени q() и я не могу больше её использовать.

но наверное человек работал ИСХОДЯ ИЗ ДАННОГО МНОЙ примера) и думал что внутри q() не будет ни какого кода кроме w()
это паттерн такой. и придуман он для того, чтобы не создавать каждый раз что-нибудь (кэшировать) и чтобы не захламлять скоп.

один пример - кеширование объекта настроек по-уолчанию.
function ajax(){

    var def = {
         "async":true
    };

    ajax = function(obj){
        // def сохранён в замыкании
        extend(obj, def);
    };

    ajax.apply(this,arguments);

};

ещё пример - удаление ветви кода при использовании опр. браузера.
// было :
function addScript(url, callback, parent){

    var script = document.createElement("script"),
        // ищем head каждый раз.
        parent = parent || document.getElementsByTagName('head')[0];



     // для IE<9.
    if('\v'=='v'){
        script.type = "text/javascript";
        script.onreadystatechange = function(){
            //this == script, но я буду использовать переменную
            if(script.readyState == "complete" || script.readyState == "loaded"){
                callback();
                // memory leak
                script.onreadystatechange = script.onload = null;
            }
        };
    } else {
        // нормальное поведение.
        script.onload = callback;
    }

    script.src = url;    
    parent.appendChild(script);
};

// стало :
function addScript(){

    // ищется только один раз
    var head = document.getElementsByTagName('head')[0];

    if('\v'=='v') // ie < 9

        addScript = function(url, callback){

            var script = document.createElement('script');

            script.onreadystatechange = function(){
                if(this.readyState == "complete" || this.readyState == "loaded"){
                    callback();
                    script.onreadystatechange = script.onload = null;
                };
            };
            
            script.type = "text/javascript";

            script.src = url;

            head.appendChild(script);
        };

    else 

        addScript = function(url, callback){

            var script = document.createElement("script");

            script.src = url;

            script.onload = callback;

            head.appendChild(script);

        };

    addScript.apply(this, arguments);
};


да, немного больше кода, немного больше запутанность кода. но , если ясно понимать, что тут происходит, всё становится понятным.

не ищется каждый раз head. конечно, в первом случае head можно было сохранить в переменной ещё до функции, но в данном случае мы это не рассматриваем.

во втором случае не просчитывается условие. следует понимать, что в данном случае это мало чего сэкономило, но в функции, в которой каждая строчка является if'ом, проверяющим браузер (или вообще любой другой if), это может сэкономить время. ты же любитель муравьиной оптимизации, Livanderiaamarum ?

во втором случае на выходе получается чистая функция. так сказать, "скомпилированная под конкретный браузер". в этом можно убедиться, вызвав addScript.toString();
Ответить с цитированием