Помогите разобраться с фрагментом кода. Установка пары ключ-значение для функции как у объектов
Наткнулся на фрагмент кода кэширования результата работы querySelector. Знаю, что этот метод довольно "тяжелый", поэтому хотел попробовать его применить и потестить в какой-нибудь своей вёрстке. Только вот не смог понять как этот код работает.
function cache(key, value) {
if (typeof value == 'undefined') {
return cache[key];
}
cache[key] = value;
}
_io_q = function(selector){
if (!cache(selector)) {
cache(selector, document.querySelector(selector));
}
return cache(selector);
}
Со второй функцией всё прекрасно ясно: если не существует данного селектора, записываем его в cache. Затем обращаемся к cache дабы та вернула значение value по ключу key. Вот тут мне абсолютно непонятно. Смущает cache[key] = value. Это же функция, а не объект, как такое возможно? Почему бы просто не создать какой-то объект и уже туда записывать все пары ключ-значение? Будут ли различаться подходы записи cache[key] = value и предложенный мой вариант some_object[key] = value?
Ответы (1 шт):
Поскольку в JavaScript функция является разновидностью объекта, создатели кода решили, наверное, просто сэкономить и воспользоваться самой функцией для хранилища. Альтернативы — создавать объект-хранилище в области видимости выше функции (как глобальную переменную или часть замыкания).
Процитированное вами решение немного рискованно, хотя мне с ходу трудно придумать селектор, использование которого перезаписало бы какое-то важное свойство или метод данной функции. Но если перестраховываться, лучше для таких нужд создавать объект с нулевым прототипом или вообще использовать Map.