таки да.
Цитата:
Цитата:
|
Про варианты функций
"вот этот код как раз это делает"
Вроде не совсем то Если я правильно понял, то в варианте Melky кэшируется w, и доступен сам объект функции w только через внешнюю функцию, при этом this у w=global obj у Livanderiaamarum кэшируется тоже w, но this (при обращении через self ссылается на объект хозяин свойвства, то есть q) и объект функции доступен в глобальном пространстве через q.w. |
Цитата:
|
Цитата:
function(){ return w();} ) a объект на который ссылалась ссылка до изменения удалился бы, если бы не было вызвано замыкание (из глобального пространства есть ссылка на объект функции, "задекларированный" в виде выражения в другой функции ), а так как замыкание есть, то объект висит в памяти, и единственный способ к нему добраться, т.е к его области видимости - только через новую q. Как я понимаю операцию можно разделить на две части. Не обязательно изменять саму ссылку q, можно внутренний объект функции привязать к любой переменной (т.е. ссылке, допустим у) видимой в глобальном объекте, а потом q=null или delete 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(); |
Цитата:
|
Часовой пояс GMT +3, время: 23:19. |