javascript - setInterval 始终将 deltaSec 的初始值显示为 "undefined"

标签 javascript undefined setinterval

我有问题,因为这个 deltaSec 变量总是在内部被重置:

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

甚至尝试对条件内的整个属性进行 parseInt 以尝试保证其为“数字”类型,如您所见。

验证 deltaSec 类型是否为 "number"的条件是第一个条件 (typeof deltaSec === "undefined") "else"在我开始寻找问题之前。

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

最佳答案

这是您的代码示例的正确 JS 和预期行为。

在词法 block (在本例中为 function() {})内任何位置以 var 开头的变量声明被提升到 block 的开头。你可以用这个说服自己(看控制台):

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 if 检查,将 deltaSec 设置为整数。

您的下一个 console.log(在 if 语句之后)然后将其打印为整数。

在下一个循环中,此行为重新开始,因为该变量没有在其他地方持久存在。

如果您想摆脱这种行为,请将 var 放在 deltaSec 赋值前。

关于javascript - setInterval 始终将 deltaSec 的初始值显示为 "undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53915306/

相关文章:

javascript - (切换)函数未定义

Javascript element.style.opacity 未定义。为什么?

javascript - 暂停一个简单的 slider 操作 |设置时间间隔

javascript - 如何使用jquery创建jsp页面内容并使用request.getParameter?

javascript - AngularJS - 如何恢复选择中的选定选项

java - 缩放两个项目

javascript - innerHTML 产生未定义,但正确的数据可见

javascript - 如何返回完全不区分大小写的匹配项并评估为真/假

c++ - 在我的 C++ 游戏中出现 "undefined reference to class::function"错误。

javascript - setInterval 内的 jquery .delay()