Ответ 1
Это потому, что ничего не выполняет функция. Обычно * это делается с помощью круглых скобок на конце. Контейнеры-скобки не являются тем, что делает его сразу вызываемой функцией. Пример:
var f = function() {
console.log('Call f');
return 1;
};
Это определяет функцию, которую вы позже можете вызвать, не так ли? Поэтому, чтобы вызвать его, вы должны:
f();
Теперь представьте себе следующее:
var f = function() {
console.log('Call f');
return 1;
}();
Поскольку вы вызывали функцию, f
будет равно 1
. Дополнительные скобки для скобок помогают читателю знать, что функция будет немедленно выполнена. Вот почему вы можете выполнить любое из следующих (и более):
function() {
...
}();
(function() {
...
}());
!function() {
...
}();
// This one seems to be the most common
(function() {
...
})();
Для будущей информации это фактически известно как оперативно вызываемое функциональное выражение или IIFE.
* Есть несколько исключений из этого правила. В частности, вы можете использовать new
для функции, которая не принимает аргументов и может использовать геттеры и сеттеры для объектов. Подробнее см. этот вопрос.