#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
});