Этот код ведет себя так:
(function() {
var ex1;
try {
throw new Error('blah');
} catch(ex2) {
console.log('ex i here:', ex2);
}
console.log('ex out here:', ex1);
return 'hi';
})()
Это потому, что секунда, объявленная в улове ex, видна только в области видимости улова, для получения дополнительной информации посещение
Что касается цикла, в этих итерациях js ищет объявление переменной "i" ближайшей области видимости, в которой оно содержится, и в этом случае это родительская переменная, поэтому изменяющаяся переменная "i"объявляется в начале, так как внутри цикла de нет объявления переменной.