Внешняя функция не передается должным образом в IIFE - - PullRequest
0 голосов
/ 13 июня 2018

Симпатичный вопрос noob.

У меня есть функция прослушивания событий, где я выполняю некоторые манипуляции с DOM.Это выглядит так:

(function(){
  $('.js-service-more-close').on('click', function() {
    var self = $(this);
    var service = self.closest('.service-more').prev('.service');
    var figures = self.closest('.service-more-inner-bar').next('.service-more-inner').find('figure');
    self.closest('.service-more').removeClass('service-more--is-expanded').css('max-height', 0);
    service.removeClass('service--is-active');
    figures.removeClass('fade-in');
  });
 })();

Работает нормально.

Я думал, что извлеку манипуляции в другую функцию, чтобы я мог использовать их в другом месте.Теперь у меня есть это.

var closeItUp = function() {
  var self = $(this);
  var service = self.closest('.service-more').prev('.service');
  var figures = self.closest('.service-more-inner-bar').next('.service-more-inner').find('figure');
  self.closest('.service-more').removeClass('service-more--is-expanded').css('max-height', 0);
  service.removeClass('service--is-active');
  figures.removeClass('fade-in');
};

(function(){
  $('.js-service-more-close').on('click', function() {
    closeItUp();
  });
})();

Это не работает, и я не знаю почему.Там нет очевидных ошибок консоли.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 13 июня 2018

Проблема в том, что this не тот, который вы ожидаете, вы потеряли его, когда переместили функцию в другое замыкание (window в данном случае).Распространите это так:

(function(){
  $('.js-service-more-close').on('click', function() {
    closeItUp.call(this);
  });
})();

... или, что еще лучше:

(function(){
  $('.js-service-more-close').on('click', closeItUp);
})();

Таким образом, функция closeItUp получит правильный объект this из jQuery и ваши селекторы будут работать правильно.

...