Я часто использую статические переменные функции, и очень жаль, что в JS нет встроенного механизма для этого. Слишком часто я вижу код, в котором переменные и функции определены во внешней области, даже если они просто используются внутри одной функции. Это безобразно, подвержено ошибкам и просто напрашивается на неприятности ...
Я придумал следующий метод:
if (typeof Function.prototype.statics === 'undefined') {
Function.prototype.statics = function(init) {
if (!this._statics) this._statics = init ? init() : {};
return this._statics;
}
}
Это добавляет метод «статика» ко всем функциям (да, просто расслабьтесь об этом), при вызове он добавляет пустой объект (_statics) к объекту функции и возвращает его. Если указана функция инициализации, _statics будет установлен на результат init ().
Затем вы можете сделать:
function f() {
const _s = f.statics(() => ({ v1=3, v2=somefunc() });
if (_s.v1==3) { ++_s.v1; _s.v2(_s.v1); }
}
Сравнивая это с IIFE, который является другим правильным ответом, он имеет недостаток, заключающийся в добавлении одного присваивания и одного if при каждом вызове функции и добавлении члена функции _statics к функции, однако есть несколько преимуществ: аргументы находятся вверху, а не во внутренней функции, использование «статического» во внутреннем коде функции явно с «_s». префикс, и в целом проще смотреть и понимать.