Я изучаю THREE.js и заметил шаблон, в котором функции определены так:
var foo = ( function () {
var bar = new Bar();
return function ( ) {
//actual logic using bar from above.
//return result;
};
}());
(Пример смотрите здесь метод raycast ).
Нормальное изменение такого метода будет выглядеть следующим образом :
var foo = function () {
var bar = new Bar();
//actual logic.
//return result;
};
Сравнивая первую версию с обычным вариантом, кажется, что первая отличается тем:
- Он присваивает результат самоисполняющейся функции.
- Он определяет локальную переменную внутри этой функции.
- Он возвращает фактическую функцию, содержащую логику, которая использует локальную переменную.
Таким образом, основное отличие состоит в том, что в первом варианте полоса назначается только один раз при инициализации, а во втором варианте эта временная переменная создается каждый раз при вызове.
Мое лучшее предположение о том, почему это используется, заключается в том, что он ограничивает количество экземпляров для bar (будет только один) и, таким образом, экономит накладные расходы на управление памятью.
Мои вопросы:
- Верно ли это предположение?
- Есть ли название у этого паттерна?
- Почему это используется?