Помогите разобраться с фрагментом кода. Установка пары ключ-значение для функции как у объектов

Наткнулся на фрагмент кода кэширования результата работы 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 шт):

Автор решения: vsemozhebuty

Поскольку в JavaScript функция является разновидностью объекта, создатели кода решили, наверное, просто сэкономить и воспользоваться самой функцией для хранилища. Альтернативы — создавать объект-хранилище в области видимости выше функции (как глобальную переменную или часть замыкания).

Процитированное вами решение немного рискованно, хотя мне с ходу трудно придумать селектор, использование которого перезаписало бы какое-то важное свойство или метод данной функции. Но если перестраховываться, лучше для таких нужд создавать объект с нулевым прототипом или вообще использовать Map.

→ Ссылка