Я думаю, что замыкания полностью излишни для этого и только усложняют код.
То, что вы описываете, известно как статическая переменная в объектно-ориентированных языках, и ее можно легко имитировать в JS, прикрепляя свойства непосредственно к функции. Это возможно, потому что функции являются первоклассными объектами в JS:
function run(arg) {
if (!run.ranAlready) { // run.ranAlready is undefined at first, so falsy
run.ranAlready = true;
init();
}
/* more code */
}
Это намного проще, чем вложенные функции, и вы можете продолжать использовать run()
точно таким же образом.
Еще одним преимуществом является то, что для модульного тестирования вы все равно можете получить доступ к свойству ranAlready
из-за пределов функции, чтобы проверить, что ваш код работает правильно:
assert(run.runAlready == false);
run();
assert(run.runAlready === true);
Конечно, это нельзя использовать для анонимных функций, например, в обработчиках событий, но не намного ли лучше, если присвоит этой анонимной функции имя вместо использования вложенных функций и дополнительной функции призывание