Ну с замыканиями всё просто
Допустим у нас есть функция которая читает строки, которая в свою очередь читает символы.
function readString(){
var string;
string = readChar();
}
function readChar(){
return 'a';
}
В таком коде у нас есть 2 области видимости, тк. они создаються функциями и функция readChar ничего не знает о переменной string;
Теперь мы "закроем" эту переменную внутри замыкания.
function readString(){
var string;
readChar();
function readChar(){
string = 'a';
}
}
Теперь переменная string есть в замыкании. Когда мы пытаемся обратится к какой-то переменной из функции(scope) то она ищеться снача в нём, если не нашлась тут то ищеться во внешней области видимости, а внешней для функции readChar будет функция readString и в неё есть переменная string. Мы её нашли, если её там не было бы, то её поиск проходил бы вплоть до объекта window.
На счёт второго вопроса ответ есть
тут
Это лучший русскоязычный ресурс по javascript