В JavaScript свойства функции являются аналогом статической переменной.
Функция в JavaScript является объектом, поэтому можно присваивать свойства прямо к ней, вот так:

Отличие свойств от параметров/переменных в том, что параметры/переменные доступны только внутри функции, а свойства функции – доступны отовсюду и всегда.
Пример:

Теперь мы можем взять и поменять из внешнего кода значение счетчика:

Итого:
· Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере — window.
· При создании функция получает системное свойство [[Scope]], которое ссылается на LexicalEnvironment, в котором она была создана.
· При вызове функции, куда бы её ни передали в коде — она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения»
Присвоение [[Scope]] для new Function
При создании функции с использованием new Function, её свойство [[Scope]] ссылается не на текущий LexicalEnvironment, а на window:
