Вообще, там достаточно информации было, но попробую ещё проще; по частям, чтобы "уварилось". Начнём с VO.
Variable object (Объект переменных, сокращённо VO) - это объект, служащий хранилищем для:
1. переменных (var);
2. деклараций функций (function declaration, FD);
3. формальных параметров функции;
Главной особенностью здесь является то, что VO наполняется
при входе в контекст, т.е.
до выполнения кода контекста. Причём, в случае var'ов и недостающих формальных параметров под "наполнением" подразумевается резервирование слотов в VO со значением
undefined.
Пример:
function test(a, b) {
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
}
test(10); // вызов
Этапы вызова:
1. Вход в контекст:
VO = { // упрощённо; в реале он "наследуется" от Объекта активации
a: 10,
b: undefined,
c: undefined,
d: <reference to functionBody>
e: undefined
};
2. Исполнение контекста:
VO['c'] = 10;
VO['e'] = <reference to "_e" functionBody>;
Всё. Как видим, функция "x", являясь FE (function expression), а не FD, не попала в VO (поскольку, ничего не было сказано про воздействие FE на VO в пунктах выше). Если попробовать вызвать функцию "x" за пределами объявления - будет ReferenceError. С другой стороны, "_e" также является FE, но последующее присвоение её переменной "e" оставляет на неё ссылку через VO["e"].
Если здесь всё понятно, и есть желание дальше изучать, можно будет продолжить.
update:
Эм.. Оказывается, я уже в этой теме писал
почти тоже самое.