Как уже упоминалось, вы можете просто вернуть функцию b.Функции в Javascript могут передаваться таким образом, это очень хорошая особенность языка сборки мусора.
Но вы можете пойти еще лучше, если вы захотите выставить более одной функции.
Вы можете просто вернуть объект с прикрепленными методами.
function A() {
let value = 0;
return {
inc: () => ++ value,
dec: () => -- value,
show: () => console.log(value)
}
}
const a1 = A();
a1.inc(); a1.inc(); a1.show();
const b1 = A();
b1.inc(); b1.dec(); b1.dec(); b1.show();
Теперь вышеприведенное выглядит очень похоже на то, что называется class
, но это не так.Одним из недостатков этого является то, что если вы хотите создать тысячи экземпляров, класс будет лучше, поскольку он может поместить свои методы в прототип.Но, говоря о том, что, как было обнаружено с помощью React Hooks, это не так уж и плохо.
Одно большое преимущество вышеизложенного состоит в том, что вам не нужно попадать в мутный мир this
контекста экземпляров..
Для полноты здесь приведена версия класса.
class A {
value = 0;
inc() { ++ this.value; }
dec() { -- this.value; }
show() { console.log(this.value) }
};
const a1 = new A();
a1.inc(); a1.inc(); a1.show();
const b1 = new A();
b1.inc(); b1.dec(); b1.dec(); b1.show();
Также было сказано, что простое решение состоит в том, чтобы сделать a
и b
обоими глобальными, но чем больше вы избегаете глобальных, тем лучше, поэтому, если a
и b
имеют какое-то общее намерение, лучше использовать замыкания или даже класс.