Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 08.03.2011, 02:33
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Kolyaj
При вызове функции createCounter обнуляется.
Ничего не обнуляется:
function createCounter(){
  var numberOfCalls = 0;
  return function(){
    return ++numberOfCalls;
  };
};
var fn1 = createCounter();
fn1(), fn1();
var fn2 = createCounter();
fn2();
alert( fn1() ); // Ведь 3, а не 2
Aetae, как-то жестоко. Так по-приличнее, по-моему:
function џ(){
  var count = 1;
  return function(){
    if(++count === 7) return 'lol';
    return arguments.callee;
  };
};

alert( џ()()()()()()() );
Ответить с цитированием
  #12 (permalink)  
Старый 08.03.2011, 12:48
Интересующийся
Отправить личное сообщение для Goodfella Посмотреть профиль Найти все сообщения от Goodfella
 
Регистрация: 22.02.2011
Сообщений: 11

А вот еще, хотелось бы еще больше прояснить ситуацию:
Что происходит с переменной numberOfCalls? То есть, как я понимаю, у нас выходит 3 области видимости [scope1] - глобальная, [scope2] - область функции createCounter, [scope3] - вложенная функция.
После выхода из функции все эти области остаются жить благодаря замыканию, самое интересное вот что:
Переменная numberOfCalls копируется и используется как свойство [scope3], или же мы просто получаем ссылку на [scope2].numberOfCalls(условно), и уже манимулируем собственно ею.
Я подозреваю, что копируется (или же у меня в голове просто полная каша), а вот что было бы с объектом?
Ответить с цитированием
  #13 (permalink)  
Старый 08.03.2011, 13:30
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Goodfella
После выхода из функции все эти области остаются жить благодаря замыканию
Благодаря замыканию остаются жить только замкнутые переменные. И ничего никуда не копируется. Как-то проще нужно к этому относится
Ответить с цитированием
  #14 (permalink)  
Старый 08.03.2011, 13:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Sweet,
Ну так фишка то в использовании)):
function џ(b) {
    return function(a) {b=b|a;
        return function(a) {b=b&a;
            return function(a) {b/=a;
                return function(a) {b-=a;
                    return function(a) {b*=a;
                        return function(a) {b+=a;
                            return function(a) {b='Результат:'+a;
                                alert(b)
                            }
                        }
                    }
                }
            }
        }
    }
}
џ(4)(5)(2)(4)(7)(9)(2)(1)

Но опять же это бессмысленно)
__________________
29375, 35

Последний раз редактировалось Aetae, 08.03.2011 в 13:48.
Ответить с цитированием
  #15 (permalink)  
Старый 08.03.2011, 13:48
Интересующийся
Отправить личное сообщение для Goodfella Посмотреть профиль Найти все сообщения от Goodfella
 
Регистрация: 22.02.2011
Сообщений: 11

Сообщение от Sweet Посмотреть сообщение
Благодаря замыканию остаются жить только замкнутые переменные. И ничего никуда не копируется. Как-то проще нужно к этому относится
Я судил по рассуждениям Флэнагана (копи-паст):
Цитата:
Все меняется, если ссылка на вложенную функцию сохраняется в глобальной области видимости. Это происходит, когда вложенная функция передается в виде возвращаемого значения объемлющей функции или сохраняется в виде свойства какого либо другого объекта. В этом случае появляется внешняя ссылка на вложенную функцию, при этом вложенная функция продолжает ссылаться на объект вызова объемлющей функции. В результате все объекты вызова, созданные при каждом таком обращении к объемлющей функции, продолжают свое существование, а вместе с ними продолжают существование имена и значения аргументов функции и локальных переменных.
Ответить с цитированием
  #16 (permalink)  
Старый 08.03.2011, 13:49
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Aetae
Ну так фишка то в использовании
Да я понимаю

UPD: Goodfella, извините, но мой мозг не способен переварить этот поток мыслей - я просто не понимаю, что Флэнаган пытается втереть Нельзя по утрам так людей грузить

Последний раз редактировалось Sweet, 08.03.2011 в 14:13.
Ответить с цитированием
  #17 (permalink)  
Старый 08.03.2011, 18:58
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Goodfella
Переменная numberOfCalls копируется и используется как свойство [scope3], или же мы просто получаем ссылку на [scope2].numberOfCalls(условно), и уже манимулируем собственно ею.
Второе.
Ответить с цитированием
  #18 (permalink)  
Старый 08.03.2011, 22:21
Интересующийся
Отправить личное сообщение для Goodfella Посмотреть профиль Найти все сообщения от Goodfella
 
Регистрация: 22.02.2011
Сообщений: 11

Сообщение от Kolyaj
Второе.
Просто вот почему спрашиваю, взгляните на код:
function createCounter() {
	var numberOfCalls = 0;
    alert(numberOfCalls);
	return function() {
		alert(numberOfCalls);
    return ++numberOfCalls;
   }
}
var fn = createCounter();
fn(); //Выводит сообщение "0", "0", все ясно, первый вызов.
fn(); //Вызывается только вложенная функция, alert выводит "1", опять же окей.
createCounter(); //Вызывается вся функция, переменная "numberOfCalls" обнулена, alert объемлющей функции выводит "0", годиться.
fn(); //Вызывается опять только вложенная, хотя, по идее "numberOfCalls" был обнулен, alert вывел "2", вот это - не понятно.
Ответить с цитированием
  #19 (permalink)  
Старый 08.03.2011, 22:22
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

При втором вызове новый [scope2] создаётся.
Ответить с цитированием
  #20 (permalink)  
Старый 08.03.2011, 23:50
Интересующийся
Отправить личное сообщение для Goodfella Посмотреть профиль Найти все сообщения от Goodfella
 
Регистрация: 22.02.2011
Сообщений: 11

Сообщение от Kolyaj
При втором вызове новый [scope2] создаётся.
Учел, спасибо. То есть, к старому [scope2], доступ потерян?

Последний раз редактировалось Goodfella, 08.03.2011 в 23:56.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по учебнику Invis1ble Сайт Javascript.ru 12 21.03.2011 20:06
Вопрос по работе функций в PHP bayah Серверные языки и технологии 2 12.02.2011 17:42
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
мааленький вопрос по Regexp:) mirniy Общие вопросы Javascript 1 22.01.2009 20:47
вопрос по long poll megaswin AJAX и COMET 2 27.05.2008 09:20