Объявление функции в EcmaScript 6 теперь имеет блочную область, как и объявления let
(с разницей с let
в том, что переменная объявлена во внешней глобальной / функциональной области видимости).
Ваш кодглобально эквивалентно
for (var i = 1; i <= 2; i++) {
let timer = function() {
console.log("in timer");
console.log(timer.i);
}
timer.i = i;
setTimeout(timer, 1000);
}
Это означает, что у вас есть другие значения timer
.
Обратите внимание, что если вы использовали var
вместо let
и вместо функцииобъявление, вы бы получили бы дважды один и тот же журнал.
Хорошее чтение: http://2ality.com/2015/02/es6-scoping.html
Обратите внимание, что добавление свойств в функцию не очень хорошопрактика.Для этого вы должны использовать переменные области видимости, например:
for (var i = 1; i <= 2; i++) {
let timer_i = i;
setTimeout(function timer(){
console.log("in timer");
console.log(timer_i);
}, 1000);
}
, которые в этом простом случае могут быть записаны как
for (let i = 1; i <= 2; i++) {
setTimeout(function timer(){
console.log("in timer");
console.log(i);
}, 1000);
}