【问题标题】:External function not being passed properly to IIFE -外部函数未正确传递给 IIFE -
【发布时间】:2018-06-13 11:59:19
【问题描述】:

相当菜鸟的问题。

我有一个事件侦听器函数,我正在执行一些 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();
  });
})();

这不起作用,我不知道为什么。没有明显的控制台错误。

有人能指出正确的方向吗?

【问题讨论】:

  • 这个问题的标题具有误导性,因为您没有将函数传递给任何地方的 IIFE。在将代码移出相关闭包时,您只是丢失了 this 对象,但函数本身确实被调用了。
  • 感谢@Mtz 的澄清!

标签: jquery parameter-passing addeventlistener


【解决方案1】:

问题在于this 不是您所期望的,当您将函数移到另一个闭包中时您丢失了它(在这种情况下为window)。像这样传播它:

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

...或者,甚至更好:

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

这样,closeItUp 函数将从 jQuery 获取正确的 this 对象,并且您的选择器将正常工作。

【讨论】:

  • 由于代表人数少,我无法为您的答案投票,但您成功了!谢谢!
  • 您可以接受正确的答案;)很高兴我能帮上忙!
猜你喜欢
  • 2022-01-25
  • 2012-10-19
  • 2021-02-05
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多