А так ?
for (let count = 0; count < 50 ; count ++) {
setTimeout(function() {
console.log(count);
}, 0);
}
https://learn.javascript.ru/functions-closures
https://learn.javascript.ru/let-const
Дело именно в контексте и области видимости.
Функция, которая вызывается внутри setTimeout берет переменную count из замыкания, так как переменные объявленные через var всплывают, то все функции фактически будут обращаться к одной переменной, значение которой уже равно 50.
Область видимости переменной let – блок {...} тоесть каждая итерация будет брать из замыкания свою переменную.
Пожалуйста почитайте про ES6 и ES7 и используйте новые возможности JS let, const, Promise, классы, генераторы и итераторы это позволит вам писать более чистый и понятный код. Если вдруг попадете в Проект, который будет требовать поддержку IE10, вы всегда можете прогнать код через babel или использовать полифилы, а вообще избегайте таких проектов. На рынке сейчас на Фронтов спрос, и всегда можно выбрать проект поинтереснее.