Код (Javascript): this.cell.onclick = function foo(){ function drug (){ var x = 1; return function (){ return x++; } } var f = drug(); console.log(f()); }; }, Задача, вообще такая: считать сколько раз сработало событие. При срабатывании события функция f всегда возвращает 1. Не могу понять в чем проблема. Объясните, с замыканиями только начал работать)) И вообще с этим функциональным программированием беда, постепенно вникаю, но на данный момент все плохо)
Об этом в двух словах не расскажешь. Тем более, что всё давно уже изложено на доступном языке. А касаемо вашего примера, то вы же не удивились бы тому, что в примере ниже в консоль всегда бы выводилась единица: Код (Javascript): this.cell.onclick = function foo() { var x = 1; console.log(x++); }; Правильно. При каждом событии клика, мы объявляем переменную, присваивая ей какое-то значение. А чем, собственно, объявление переменной отличается от декларирования функции? И опять, правильно - ничем. При каждом событии клика, вы декларируете функцию с каким-то её сценарием и он начинает работать "с нуля".
@Deonis переменную var x = 1 вытащил в глобальную область видимости и замыкание сработало. И для меня это странно, так и в первом случае область видимости разная.
Да при чем тут замыкание? Раз переменную вы объявили вне обработчика события, то и инкремент её будет работать, как вы того и ожидаете. А будет ли происходить инкремент внутри каких-то еще функций или без них - в данном случае значения не имеет. Вот, по сути, весь ваш код без всяких выпендриваний: Код (Javascript): var x = 1; this.cell.onclick = function foo() { console.log(x++); };
@Deonis Точно!! я понял. Спасибо. Получается когда обработчик событий срабатывает предыдущие данные из обработчика стираются, создаются новые, соответственно x всегда 1, а когда я вытащил x в глобальную область видимости сработало замыкание.