За последние 24 часа нас посетили 18857 программистов и 1641 робот. Сейчас ищут 1736 программистов ...

Почему не работает замыкание js

Тема в разделе "JavaScript и AJAX", создана пользователем Rezovskij, 24 ноя 2016.

  1. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    Код (Javascript):
    1.         this.cell.onclick = function foo(){
    2.             function drug (){
    3.                 var x = 1;
    4.                 return function (){
    5.                     return x++;
    6.                 }
    7.             }
    8.             var f = drug();
    9.             console.log(f());
    10.         };
    11.     },
    Задача, вообще такая: считать сколько раз сработало событие. При срабатывании события функция f всегда возвращает 1. Не могу понять в чем проблема. Объясните, с замыканиями только начал работать)) И вообще с этим функциональным программированием беда, постепенно вникаю, но на данный момент все плохо)
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Об этом в двух словах не расскажешь. Тем более, что всё давно уже изложено на доступном языке. А касаемо вашего примера, то вы же не удивились бы тому, что в примере ниже в консоль всегда бы выводилась единица:
    Код (Javascript):
    1. this.cell.onclick = function foo() {
    2.     var x = 1;
    3.     console.log(x++);
    4. };
    Правильно. При каждом событии клика, мы объявляем переменную, присваивая ей какое-то значение. А чем, собственно, объявление переменной отличается от декларирования функции? И опять, правильно - ничем. При каждом событии клика, вы декларируете функцию с каким-то её сценарием и он начинает работать "с нуля".
     
    MouseZver, denis01 и Rezovskij нравится это.
  3. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    @Deonis переменную var x = 1 вытащил в глобальную область видимости и замыкание сработало. И для меня это странно, так и в первом случае область видимости разная.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Да при чем тут замыкание? Раз переменную вы объявили вне обработчика события, то и инкремент её будет работать, как вы того и ожидаете. А будет ли происходить инкремент внутри каких-то еще функций или без них - в данном случае значения не имеет. Вот, по сути, весь ваш код без всяких выпендриваний:
    Код (Javascript):
    1. var x = 1;
    2. this.cell.onclick = function foo() {
    3.     console.log(x++);
    4. };
     
    denis01 нравится это.
  5. Rezovskij

    Rezovskij Новичок

    С нами с:
    18 фев 2016
    Сообщения:
    84
    Симпатии:
    1
    @Deonis Точно!! я понял. Спасибо. Получается когда обработчик событий срабатывает предыдущие данные из обработчика стираются, создаются новые, соответственно x всегда 1, а когда я вытащил x в глобальную область видимости сработало замыкание.
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    denis01 нравится это.