Самозапускаемые функции являются нормальными функциями, но не имеют имени. Это делает их невозможными для вызова, кроме как сразу после объявления, что фактически делает их одноразовой функцией, которая навсегда скрыта от другого кода.
Как вы отмечаете, форма
function foo() {
console.log("foo");
}
foo()
и
(function() {
console.log("foo");
})()
ведут себя одинаково.
Однако первая форма с function foo() {...
создает именованную функцию, которая живет в этой области действия до тех пор, пока область действия не будет уничтожена. Для глобального масштаба это никогда не произойдет, оставив foo
действительным и вызываемым идентификатором для любого другого кода в вашем приложении.
Это означает, что в любое время, кто-то может сделать
foo()
и либо инициализировать модуль еще раз или, возможно, получить дескриптор к новой копии модуля.
В лучшем случае это может привести к путанице и дублированию состояния. В худшем случае, в зависимости от того, как структурирован ваш IIFE, они могут быть в состоянии копаться в скрытом состоянии и начать манипулировать им так, как вы этого не ожидаете.
Написание функции, которая является анонимной и немедленно вызывается, не позволяет кому-либо когда-либо ссылаться на нее, делая ее чистым и безопасным способом создания и использования полностью скрытой области. Вот почему вы видите, что он так часто используется для предоставления частного состояния или создания модуля.
Ну, одна дополнительная вещь, которую самоосуществляющаяся часть дает вам, что даже' xx' Безразлично» t «загрязнить» пространство имен. –