Потому что
()
означает "выполнить функцию". Это может быть как именнованная функция, так и переменная содержащая функцию.
function foo1(){ console.log('foo1'); }
var foo2 = function (){ console.log('foo2'); }
foo1();
foo2();
Результат будет одинаковый. В вашем случае в переменной
counter
находится функция - поэтому она и выполняется при попытке её вызвать как функцию.
var counter = makeCounter();
Разворачиваем:
var counter = (function makeCounter() {
function counter() {
alert('test');
};
return counter;
})();
Далее:
var counter = (function makeCounter() {
return function counter() {
alert('test');
};
})();
var counter = function() { alert('test'); };