Добрый вечер друзья, возник вопрос, скорей даже не вопрос, а полная неразбериха по теме замыканий (недавно в JS). Что бы без длинных предысторий, сразу покажу код (взял из Википедии):
function createCounter() {
    var numberOfCalls = 0;
    return function() {
        return ++numberOfCalls;
    }
}
var fn = createCounter();
fn(); //1
fn(); //2
fn(); //3
Я понимаю, что этот код делает, но абсолютно не понимаю каким образом. 
Почему при вызове функции createCounter() не обнуляется переменная numberOfCalls?
Зачем нужно копировать ссылку на функцию в переменную fn, почему ее нельзя вызвать напрямую?
Сам по себе, этот код меня не волнует, но это самый простой пример замыкания, который я, к сожалению, не могу понять. Я бы был очень благодарен, если бы вы подробно объяснили мне ситуацию, как это все считывает интерпретатор.