Передача переменных при обратном вызове JavaScript

#javascript

#javascript

Вопрос:

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

У меня есть некоторый код JavaScript, это его часть:

 var myNotification = new Notify('Notification Title', {
    body: 'message goes here',
    icon: "/icon.png",
    tag: 'for app use',
    notifyClick: functionNameHere,
    timeout: 10
});
  

Часть «functionNameHere» — это имя другой функции, которая вызывается при нажатии на уведомление, созданное этим скриптом.

Мне нужно иметь возможность передавать переменную вместе с ней, поэтому, по сути, то, что мне нужно сделать, это:

 var myNotification = new Notify('Notification Title', {
    body: 'message goes here',
    icon: "/icon.png",
    tag: 'for app use',
    notifyClick: functionNameHere('variableContentWouldbeHere'),
    timeout: 10
});
  

Однако, когда я делаю это подобным образом, это не работает должным образом.

Как бы мне этого добиться?

Комментарии:

1. notifyClick: functionNameHere.bind(someContext, yourVar)

2. Исследуйте ‘currying’ — в основном используя какой-либо вариант комментария Maxx

Ответ №1:

Вы можете достичь этого, изменив область действия функции или используя замыкания.

1-й:

 notifyClick: functionNameHere.bind('variableContentWouldbeHere');
  

И ваш контекст внутри реализации «functionNameHere» является вашим аргументом.

 function functionNameHere() {
   console.log(this === 'variableContentWouldbeHere'); //true
}
  

2-й:

Использование замыканий

 notifyClick: function() { functionNameHere('variableContentWouldbeHere'); }
  

Комментарии:

1. Ответ лучше моего 😉

2. В итоге я использовал closures, ваш второй метод. Поскольку вы были первым, кто предложил это решение, я принимаю ваш ответ.

Ответ №2:

 var myNotification = new Notify('Notification Title', {
    body: 'message goes here',
    icon: "/icon.png",
    tag: 'for app use',
    notifyClick: function(){
    functionNameHere('variableContentWouldbeHere');    
    },
    timeout: 10
});
  

Комментарии:

1. Ваше решение использовать замыкания — это то, что я в итоге сделал. Однако кто-то другой ответил с тем же решением до вас, поэтому я принял их ответ. Тем не менее, я дал вам преимущество. Спасибо за вашу помощь 🙂

2. Я тоже рад поблагодарить вас 🙂

Ответ №3:

Я не совсем уверен, что вы пытаетесь сделать, но я предполагаю, может быть, вам нужно что-то вроде этого:

 var myVariable = {};
var myNotification = new Notify('Notification Title', {
   body: 'message goes here',
   icon: "/icon.png",
   tag: 'for app use',
   notifyClick: function(e){
      functionNameHere(myVariable);
   },
   timeout: 10
});
  

Комментарии:

1. Ваше решение использовать замыкания — это то, что я в итоге сделал. Однако кто-то другой ответил с тем же решением до вас, поэтому я принял их ответ. Тем не менее, я дал вам преимущество. Спасибо за вашу помощь 🙂

2. Спасибо @SherwinFlight

Ответ №4:

Вы не можете повлиять на то, как вызывается обратный вызов, это определяет код в классе Notify. Если вы попытаетесь передать это, как во втором примере, функция «functionNameHere» будет вызвана немедленно, и ее результат будет передан конструктору Notify в качестве функции обратного вызова, что не то, что вы хотите.

Что вы могли бы сделать, так это сделать вашу функцию functionNameHere оболочкой, которая возвращает другую функцию, которая будет использоваться в качестве обратного вызова.

Комментарии:

1. Итак, в принципе, если класс Notify не разрешает передачу переменных, это не будет работать?

2. Просто используйте bind , и вы сможете привязать контекст и аргументы к функции

Ответ №5:

Вы могли бы передать анонимную функцию, которая вызывает вашу функцию следующим образом:

 var myNotification = new Notify('Notification Title', {
    body: 'message goes here',
    icon: "/icon.png",
    tag: 'for app use',
    notifyClick: () => functionNameHere('variableContentWouldbeHere'),
    timeout: 10
});