@BushaevDenis

Как работает область видимости в JS?

Не совсем понимаю, почему мои переменные не работют в функции.
function move_modal(ev) {
            console.log(lastPosY);
            if (!isDragging) {
                isDragging = true;
                lastPosY = modal_addproduct.offset().top;
            }

            var posY = ev.gesture.deltaY + lastPosY;


            modal_addproduct.css('top', posY + "px");

            if (ev.isFinal) {
                isDragging = false;
            }
        }

        var lastPosY = 0;
        var isDragging = false;

        var modal_header = $('.modal-header');
        var modal_addproduct = $('#addproduct');
        modal_header.hammer({direction: Hammer.DIRECTION_ALL, threshold: 0}).bind("pan", function (ev) {
            move_modal(ev);
        });

Когда событие тригггерится - то в консоль всегда выводится 0 из переменной lastPosY.
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
NightmareZz
@NightmareZz
Нищий разработчик из Симферополя
Почитай первую попавшуюся статью в интернетах про различия между let и var. Там будет и про области видимости, и про всё, что тебе нужно.
Ответ написан
Вы присваиваете новое значение переменной lastPosY уже после того, как вывели предыдущее значение в консоль, так как предыдущее значение равно 0, то и в консоль всегда попадает 0.
Можно пройтись дебаггером в Chrome DevTools и быстро понять, что происходит.

function move_modal(ev) {
  console.log(lastPosY); // Шаг 3. выводиться значение из Шага 1
  if (!isDragging) {
      isDragging = true;
      lastPosY = modal_addproduct.offset().top; // Шаг 4. lastPosY === modal_addproduct.offset().top
  }
  // Шаг 5. console.log(lastPosY) Выведеться информация из Шага 4
  var posY = ev.gesture.deltaY + lastPosY;


  modal_addproduct.css('top', posY + "px");

  if (ev.isFinal) {
      isDragging = false;
  }
}

var lastPosY = 0;  // Шаг 1. lastPosY === 0
var isDragging = false;

var modal_header = $('.modal-header');
var modal_addproduct = $('#addproduct');
modal_header.hammer({direction: Hammer.DIRECTION_ALL, threshold: 0}).bind("pan", function (ev) {
  move_modal(ev); // Шаг 2. вызываем функцию
});


Вот облегченный пример того, что происходит

function move_modal(ev) {
  console.log(lastPosY) // 0
  lastPosY = 4;
  console.log(lastPosY) //4
}

var lastPosY = 0;

move_modal();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы