window хранит переменные по значению, а не по ссылке потому, что JavaScript использует копирование значения при присваивании переменной, а не создание ссылки на объект. Когда мы присваиваем значение одной переменной другой, JavaScript копирует значение из одной переменной в другую, а не создает ссылку на то же значение.
В случае с переменной `q`, когда мы передаем ее в функцию `foo.bind(window, q)`, происходит копирование значения 0 из переменной `q` в аргумент функции. Далее, при вызове этой функции, она работает с копией значения 0, а не с самой переменной `q`. Поэтому, изменение значения аргумента `value` внутри функции `foo` не влияет на значение переменной `q` в контексте `window`.
Если бы JavaScript использовал передачу переменных по ссылке, то при изменении значения аргумента `value` внутри функции `foo`, также бы изменялось и значение переменной `q` в контексте `window`.