Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Откуда вызвана функция


Автор: Aver78 21.1.2020, 16:49
Есть json объекты такого типа:

a = {
   func1() {
     alert('Как тут получить имя объекта вызвавшего функцию, в данном случае,  - b ?')
     }
}

b = {
   func2() {
       a.func1();
     }
}

P.S. Понятно дело не передавая имя объекта в параметрах функции.

Автор: _zorn_ 22.1.2020, 16:37
Никак. Адекватными методами. 
А из неадыкватных можно попробовать бросить исключение и прогуляться по стектрейсу. Но хз возможно ли это в js

И это не json объекты. json объект это строка типа {"bla":"blabla"} которую можно превратить в обычный объект используемого ЯП.

PS: JavaScript Object NOTATION
PPS. Да и "json объект" звучит как "АвтоВАЗ" - "Автомобильный Волжский Автомобильный Завод"

Автор: _zorn_ 22.1.2020, 16:57
Хотя можно "имя" не передавать, а замутить `bind` или `call`
Тут уж сам решай 
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/call

Что то типа того
Код

a = {
   func1() {
      alert('Caller name is ' + this.name)
   }
}

b = {
    name: 'BBBB',
    func2() {
        a.func1.call(this);
    }
}


Только сразу скажу, такой код начнет вонять через неделю  smile 

Автор: Aver78 22.1.2020, 21:04
Цитата

Хотя можно "имя" не передавать, а замутить `bind` или `call`


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

Добавлено через 14 минут и 24 секунды
Цитата

Да и "json объект" звучит как

Как то ни разу не озаботился тем что бы расшифровать эту аббревиатура .

Как пройтись по стеку я не понял. Я вообще, мягко говоря, не фанат js, и знания соответствующие.

Автор: Aver78 25.3.2020, 13:37
Так  и не сумел найти ответа.  Может быть вопрос решаем через автоподстановку параметра, хотя бы. Но я и это не могу придумать как сделать.

Код

a = {
   func1(param1) {
     alert(param1)
     }
}

b = {
   name: 'Я - b',
   func2() {
       a.func1(this.name);
     }
}
b.func2();



Для вызова  a.func1 во всех объектах будет использована одна и та-же конструкция для задания параметра param1 - this.name.

Как бы его прописать в функции изначально ? 
Такой вариант соответственно неверный, но возможно есть правильный ? 
Код

a = {
   func1(param1 = this.name) {
     alert(param1)
     }
}





Автор: od0201 7.5.2020, 18:39
Не совсем понятно, зачем Вам имя объекта.
Если Вы имели ввиду сам объект, который вызвал функцию, то так
Код

  const a = {
    func1:function () { console.log(`объект, вызвавший функцию `, this) }
  }
  const b = {
    func2:a.func1
  }
//  a.func1()
  b.func2()


Код

обьект, вызвавший функцию  {func2: ƒ}

Если в объекте b задать поле name, то в func1 сможете получить это поле => this.name
Если Вы хотите выводить в Alert, то туда объект преобразуется в строку "[object Object]", а вот с this.name в Alert у Вас проблем не будет
Код

  const a = {
    func1:function () { alert(`имя обьект, вызвавшего функцию: ${this.name}`) }
  }
  const b = {
    func2:a.func1,
    name:'poipoi'
  }
  b.func2()


Автор: Aver78 8.5.2020, 19:34
При  таком определении 

Код

  const a = {
    func1:function () { console.log(`объект, вызвавший функцию `, this) }
  }


Да, this приходит.

А при таком 

Код

const a = {
   func1() { console.log(`объект, вызвавший функцию `, this) }
}


Нет. А мне нужно передавать в функцию параметры, что непонятно как сделать при первом варианте определения.


Неправильно я отписался. func2 - это же не функция, а по сути, просто алиас для вызова Func1. А должна быть функция. И в тот момент когда она превращается в функцию - 

func1:function () {a.func1()}

, то this  в ней переопределяется на объект b. и откуда ее не вызови this будет один и тот же.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)