for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log("My value: " + i);
}, 1);
}
> 
My value: 3
My value: 3
My value: 3
Why:
Variable Global scope, and JavaScript asynchronous event loop single thread execution.
Solution:
// Block scope, ES2005
for (let i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log("My value: " + i);
    }, 1000);
}
//Immediately Invoked creation, and function scope.
for (var i = 0; i < 3; i++) {
    setTimeout((function(pNum) {
        return function() {
            console.log('i: ', pNum)
        }
    })(i), 1000);
}
//  IIFE (Immediately Invoked Function Expression)
for (var i = 0; i < 3; i++) {
    (function(pNum = i) {
        setTimeout(
            function() {
                console.log('i : ', pNum)
            }, 1000)
    })(i);
}
Enjoy the sunshine,
 
