javascript Имя переменной как имя функции(/класса) - одинаковые -- когда сработает, а когда нет

Интересная проблема возникает при совпадении имени переменной и имени класса, например:

start();

function start() {
  var Task = new Task();
};

function Task() {
	console.log('work!');
}

// ОШИБКА: TypeError: TaskPackage is not a constructor

Чтобы исправить, можно написать так (хотя бы изменим букву в переменной):

start();

function start() {
  var task = new Task();
};

function Task() {
	console.log('work!');
}

// выполнится успешно

НО: если написать вот так:

var Task = new Task();

function Task() {
	console.log('work!');
}

То ошибки не будет!

Почему это происходит

На вопрос ответил deceze.

Дело в том, что здесь как раз наблюдается эффект подъёма и данный код работает следующим образом.

Последний фрагмент по сути работает так:

var Task;  // (undefined)

Task = function () { 
    console.log('work!');
};

Task = new Task(); // по сути присваивание переменной-функкции самой себе! (всё нормально)

А первый так:

var start, Task;

start = function () {
  var Task; // (undefined) -- перекрываем глобальную локальной для этой функции
  Task = new Task(); // переменная вообще не инициаллизирована! (ошибка)
};

Task = function () {
    console.log('work!');
};

start();