Это правильный JS и ожидаемое поведение для вашего образца кода.
Объявление переменной, начинающейся с var
в любом месте лексического блока (в данном случае function() {}
), выводится наначало блока.Вы можете убедиться в этом с помощью этого (посмотрите на консоль):
setInterval(function() {
console.log("Before assignment");
console.log(globalElement);
var globalElement = "bar";
console.log(globalElement);
}, 1000);
Ваша функция фактически эквивалентна следующему:
timeLineUpdater = setInterval(function (){
var deltaSec;
var arrayTd = document.getElementsByClassName("someclass");
if(typeof constructionTime === "undefined"){
var constructionTime = document.getElementById("elementId").value;
}
if(typeof deltaSec == "number"){
console.log(typeof deltaSec);
if(deltaSec>0){
deltaSec--;
} else {
deltaSec = deltaSec;
}
}
if(typeof deltaSec === "undefined"){
console.log(typeof deltaSec);
deltaSec = parseInt(60 - parseInt(constructionTime.split(":")[2]));
}
console.log(deltaSec);
console.log(typeof deltaSec);
if(deltaSec == 0){
//do something
deltaSec = 60;
}
},1000);
В результате в самом первом операторе if
deltaSec
undefined (так как он указан как локальная переменная внутри этой функции где-то внизу, и интерпретатор уже зарезервировал это).В результате выполняется проверка undefined
if, которая устанавливает целое число deltaSec
.
Ваш следующий console.log
(после операторов if) затем печатает его как целое число.
В следующем цикле это поведение начинается заново, поскольку переменная не сохраняется в другом месте.
Если вы хотите избавиться от этого поведения, отбросьте var
перед deltaSec
присваиваниями.