Если вы пришли из статически скомпилированного языка, иногда JavaScripts освобождает упаковку / распаковку типов, что может показаться чуждым.Однако в вашем примере не должно быть проблем.
Однако существуют другие способы хранения данных в элементе, и если ваши данные усложняются, хранение в атрибуте данных может оказаться не самой лучшей идеей..
Один из вариантов - это просто расширение вашей идеи атрибута данных.Вы можете использовать JSON для сериализации ваших данных:
element.dataset.options = JSON.stringify({timerId: setTimeout(....)});
Один из недостатков вышеизложенного состоит в том, что типы, которые вы можете хранить, ограничены тем, что JSON может сериализовать, но такие вещи, как строки / целые числа / массивы и т. Д. Работают хорошо.
Элементы в JavaScript такие же, как и любой другой объект.Таким образом, теоретически вы можете просто хранить как свойство:
element._mytimerid = setTimeout(...`,
При таком подходе вы должны быть осторожны с тем, что вы назвали свойством.
Закрытия являются популярным выбором:
function setupBlur() {
var timerId = null;
element.onBlur = function () {
clearTimeout(timerId);
timerId = setTimeout(.....
}
}
setupBlur();
Вы также можете использовать вышеупомянутое внутри IIFE, чтобы сохранить вызов setupBlur:
(function () {
var timerId = null;
element.onBlur = function () {
clearTimeout(timerId);
timerId = setTimeout(.....
}());
Более современный способ хранения данных в элементе - использование WeakMap:
const timerIds = new WeakMap();
.....
const timerId = timerIds.get(element);
clearTimeout(timerId);
timerIds.set(element, setTimer(.....));