Я использую функцию для создания других функций, которые будут использоваться в обработчике событий документа, поэтому подпись возвращаемых функций должна соответствовать сигнатуре возвращаемых функций обработчик событий, например. function (event, ui)
.Как сравнить функцию, когда функция создается в результате другой функции
Код выглядит следующим образом
function createEventHandler(refFn, additionalMods) {
var createdEvent = function (event, ui) {
// Merge the properties of additionalMods with an object { event, ui }
// call function with refFn and the resulting object as parameters
}
createdEvent.ready = true;
return createdEvent;
}
Я удалил код сгенерированной функции для ясности, но внутри refFn
и additionalMods
переменных обрабатываются внутри.
Теперь при обработке пользовательского ввода я называю следующую строку
var handler = events[i].handler.ready ?
events[i].handler :
createEventHandler(events[i].handler);
В основном обрабатывать массив данных, что каждый имеет свойство обработчик, который является либо функцией или результатом вызова createEventHandler.
Суть в том, что если функция в массиве обработана, то передайте эту функцию «как есть», если не обработать функцию и сохранить результат, поэтому в конце все функции обработаны.
Прямо сейчас я присоединяю свойство, называемое готовым к сигналу о том, что функция была обработана, поскольку, как оказалось, нет надежного метода для получения имени функции в соответствии с this post, но это не так.
Я также попытался использовать прототип для сравнения, но это не работает, потому что новая функция создается каждый раз и находится внутри области видимости, поэтому я не могу получить ссылку для сравнения.
Я даже попытался
events[i].handler.prototype == createEventHandler().prototype
но, конечно, это не сработало.
Кто-нибудь знает, как я могу сгенерировать эти функции и иметь надежный способ сравнить их, чтобы узнать, были ли они созданы моим кодом или нет.
{Редактировать}
Чтобы добавить дополнительные разъяснения
Все выше код находится под той же области видимости означает код, который обрабатывать массив имеет видимость над функцией createEventHandler
. Я могу изменить этот код, все, что я хочу, что я не могу изменить, - это содержимое массива, когда-то создается. Я должен перебирать его по мере его появления и генерировать или не основываться на том, что работа уже выполнена.
Создатель createEventHandler также доступен пользователю через функцию API. Предположим, что пользователь вызывает evt.generate('model')
, это создаст обработчик событий, который выполняет определенную работу, используя функцию createEventHandler под капотами. Если тогда вы можете позвонить evt.generate('bind')
, другой будет сгенерирован, что сделает другую работу.
Это поведенческое поведение, которое предоставляется пользователям по умолчанию, но они могут выбрать, чтобы добавить их пользовательское поведение, если ни одна из предопределенных не подходит для задачи.
Все данные объявлены один раз, но содержимое массива разрозненно, потому что я могу написать следующее и должно работать.Я пропустил большинство других нерелевантных свойств.
var events = [
{
event: 'pageshow',
handler: evt.generate('model')
},
{
event: 'pagebeforeshow',
handler: function (params, last) {
// My custom handler for this case
}
}
];
После обработки массива все обработчики находятся в одном формате и готовы к привязке. createEventHandler
необходим во всех случаях, потому что я использую инъекцию зависимостей для подачи данных для этих параметров, поэтому в основном это «если не вызывать, а затем вызывать его и выполнять работу по вложению зависимостей», поэтому мне нужно сравнить функции.
Возможно, не самый причудливый ответ, но вы всегда можете использовать список bools, по одному для каждой функции, и каждая функция переключает его как последний шаг, и вы проверяете свой список bools одновременно. – Spacemonkey
Это не работает, потому что я не могу контролировать значение свойства 'handler'. Я предоставляю пользователю метод, который будет генерировать эти функции, или они пишут настраиваемый код, который должен быть обработан после. Я не могу заставить их писать код кода так, как я хочу, и что это не имеет для них никакого смысла. – devconcept
Свойство '.ready', кажется, является правильным решением здесь. Что именно вам не нравится? – Bergi