Как работает замыкание?
Замыкание - способность функции хранить ссылку на переменную из вышестоящего контекста. Если на функцию высшего порядка inCounter не будет ссылок, то сборщик мусора ее уничтожить. А так как контекстом функции inCounter пользуется функция f1 (ссылается на переменную localVar), то соответственно переменные в inCounter не уничтожатся.
Вот псевдокод, в общих чертах иллюстрирующий устройство вложенных областей видимости:window[
    // Все функции, объекты и свойства windows

    functionOne(){ var one = 1; } [

        functionTwo(){  var two = 2; }

    ]
]
Здесь квадратными скобками я условно показал область видимости, создающуюся для сущности слева от открывающей скобки. В js область видимости определяется функцией и любое кол-во вложенных функций имеет доступ ко всей цепочке областей видимости своих предков вплоть до window.
Очень хорошо (на мой взгляд) более детально дано разъяснение здесь.