Вызов метода изнутри, потеря контекста?

199
04 марта 2019, 21:10

Почему в консоли пишет:

Uncaught TypeError: commercialOfferModal.close is not a function

Почему в данном коде self или commercialOfferModal является undefined?

Если commercialOfferModal.close(); вызывать снаружи функции commercialOfferModal, то всё срабатывает, а изнутри нет. Потому что commercialOfferModal является undefined?

(function commercialOfferModal(){
    var self = this;
    $('.commercial-offer-modal_open').click(function(){
      $('.commercial-offer-modal__overlay').fadeIn(300);
      $('.commercial-offer-modal__content').animate({'right': "0"}, 300);
    });
    $('.commercial-offer-modal_close').click(function(){
      self.close();
    });
    $('.commercial-offer-modal__overlay').click(function(){
      self.close();
    });
  })();
  commercialOfferModal.close = function(){
    $('.commercial-offer-modal__overlay').fadeOut(200);
    $('.commercial-offer-modal__content').animate({'right': "-704px"}, 300);
    $('input').removeClass('error');
    $('p.error-text ').text('');
  };
Answer 1

Измените Ваш код с:

  commercialOfferModal.close = function(){ 

на:

  commercialOfferModal.prototype.close = function(){

Проблема в том, что вы добавляете метод к объекту, а не к экземпляру commercialOfferModal. Другими словами, метод будет доступен по полной ссылке commercialOfferModal.close и дальше, но не доступен через this, так как другая область видимости

READ ALSO
Как Ajax`ом забрать JS c Web-морды IP камеры?

Как Ajax`ом забрать JS c Web-морды IP камеры?

У нас в компании есть внутренний сайт,на котором есть доступ к IP камерам, суть такова - нажимаем на иконку камеры и выводится изображение,...

215
:root Angular 5

:root Angular 5

Мне нужно динамически применить некоторые CSS custom properties в :root{} Как я могу это сделать? Заранее,спасибо

223
Переход от Jquery на чистый JS($(this))

Переход от Jquery на чистый JS($(this))

Меня попросили избавиться от Jquery и написать весь код на js, проблема в том, что я не очень понимаю как мне заменить $(this)Например

188
on_action_executed в odoo 10.0

on_action_executed в odoo 10.0

В версии odoo 80, в ActionManager в свое время была функция on_action_executed

189