Сообщение от 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();