Задать вопрос

Почему не работает замыкание в jQuery.on()?

На learn.javascript.ru уведел пример замыкания:

function makeCounter() {
  var currentCount = 0;
     
  return function() {
    currentCount++;
    return currentCount;
  };
}
 
var counter = makeCounter();
 
// каждый вызов увеличивает счётчик
counter();
counter();
alert( counter() ); // 3


Почему когда counter() вставить в $('.txt').on('click'...) - не работает?

Пример:

$('.txt').on('click', function(){
	  	console.log($(this).text());
	  	counter();
	  });

		function makeCounter() {
		  var currentCount = 0;
		    currentCount++; 
		  return function() {	
		    return currentCount;
		  };
		}
		 
		var counter = makeCounter();	 
		// console.log(counter());


Мне нужно использовать подобное в проекте для того, чтобы сохранить в переменной последний элемент, по которому кликали, чтобы потом он был доступен глобально и другой функцией менять стили элемента.
  • Вопрос задан
  • 3055 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Решения вопроса 1
Почему когда counter() вставить в $('.txt').on('click'...) - не работает?

Вы пытаетесь сделать замыкание на переменную, которой в этот момент еще нет. Соблюдайте логику выполнения - сначала определяем counter и лишь затем делаем на него замыкание:
function makeCounter() {
    var currentCount = 0;     
    return function() {
        return ++currentCount;
    };
}
		 
var counter = makeCounter();	

$('.txt').on('click', function(){
    console.log($(this).text());
    counter();
});


Если Вам нужно сохранить последний элемент, на который кликнули - код может выглядеть вот так:
$(function(){
    var $lastClicked;
    $('.txt').on('click', function(){
        $lastClicked = $(this);
    });
});


Главное помните - не засоряйте глобальную область видимости без особой необходимости.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽