Какой порядок инициализации в JavaScript?

Как создаются переменные и функции, какие стадии, я как то видел просто что alert’ом вывели переменную но алерт был до места объявления, как такое возможно???

Вообще если меня не подводит память все переменные и глобальные объекты записываются свойством window, то есть сначала проверяются все имена и все переменные и добавляются в глобальный объект window. Сама инициализация выглядит так:

// На момент инициализации, до выполнения кода:
// window = { fun: function, first: undefined, gl: undefined }

var first = 25;
// window = { fun: function, first: 25, gl: undefined }

function fun(arg) { /*...*/ }
// window = { fun: function, first: 25, gl: undefined } без изменений, fun обработана ранее

var gl = function(arg) { /*...*/ };
// window = { fun: function, first: 25, gl: function }

То есть сначала создаются функции которые описаны как функции, переменным же пока присвоено значение undefined, переменным же оно присваивается когда поток выполнения доходит до переменной.