setInterval всегда показывает начальное значение deltaSec как «неопределенное» - PullRequest
0 голосов
/ 24 декабря 2018

У меня проблема, потому что эта переменная deltaSec всегда сбрасывается внутри:

if(typeof deltaSec === "undefined"){...}

Даже пытался разобрать весь атрибут внутри условия, чтобы попытаться гарантировать его как тип "число", так как выможно увидеть.

И это условие, проверяющее, является ли тип deltaSec «число», было первым условием (typeof deltaSec === "undefined") «еще», прежде чем я начал обнаруживать проблему.

timeLineUpdater = setInterval(function (){
    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);
        var deltaSec = parseInt(60 - parseInt(constructionTime.split(":")[2]));
    }
    console.log(deltaSec);
    console.log(typeof deltaSec);
    if(deltaSec == 0){
        //do something
        deltaSec = 60;
    }
},1000);

А такжеэто был поиск решения:

if(deltaSec>0){
    deltaSec--;
} else {                  //this
    deltaSec = deltaSec;
}

Фактические результаты консоли:

Бесконечное повторение:

undefined
x //started value
number

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я думаю, вы должны объявить constructionTime и deltaSec вне области действия функции-обработчика setInterval.Что происходит с вашим кодом, так это то, что вы объявляете свои переменные внутри контекста предложений if, и они не видны вне этой области.Кстати, почему deltaSec = deltaSec; в предложении else.Это ничего не делает.Я думаю, что ваш код должен выглядеть примерно так, хотя я не уверен, что вы пытаетесь сделать здесь.

var deltaSec;
var constructionTime;
var timeLineUpdater = setInterval(function (){
    var arrayTd = document.getElementsByClassName("someclass");
    constructionTime = document.getElementById("elementId").value;
    deltaSec = 60 - parseInt(constructionTime.split(":")[2]);
    console.log(deltaSec);
    console.log(typeof deltaSec);
    if(deltaSec == 0){
        //do something
        deltaSec = 60;
    }
},1000);
0 голосов
/ 24 декабря 2018

Это правильный 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 deltaSecundefined (так как он указан как локальная переменная внутри этой функции где-то внизу, и интерпретатор уже зарезервировал это).В результате выполняется проверка undefined if, которая устанавливает целое число deltaSec.

Ваш следующий console.log (после операторов if) затем печатает его как целое число.

В следующем цикле это поведение начинается заново, поскольку переменная не сохраняется в другом месте.

Если вы хотите избавиться от этого поведения, отбросьте var перед deltaSec присваиваниями.

...