Это просто старая старая функция, которая вызывается немедленно и возвращает объект, на который затем ссылается f
.
Функции, на которые ссылается возвращаемый объект, сохраняют способность ссылаться на переменную a
.
Никакой код вне этой немедленно вызванной функции не может ссылаться на a
, поэтому он обладает некоторой защитой, поскольку вы точно контролируете, что происходит с a
с помощью экспортированных вами функций.
Этот шаблон иногда называют модульным шаблоном .
Что касается вашего обновленного вопроса, он не работает так же, потому что a
теперь является общедоступным свойством объекта.
Для функций, ссылающихся на него, они могут выполнить:
f.a;
или если функция будет вызываться из объекта f
, они могут выполнить:
this.a;
Вот так:
var f = {
a : 0,
f1: function (){
alert( this.a );
},
f2: function (param){
this.a = param;
}
}
f.f2( 123 );
f.f1(); // alerts 123
Но главное, что a
общедоступно. Любой код, имеющий доступ к f
, может обращаться к f.a
и, следовательно, вносить в него изменения без использования функций f1
и f2
.
В этом прелесть первого кода. Вы можете точно контролировать, что происходит с a
.