Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setInterval始终将deltaSec的初始值显示为;“未定义”;_Javascript_Undefined_Setinterval - Fatal编程技术网

Javascript setInterval始终将deltaSec的初始值显示为;“未定义”;

Javascript setInterval始终将deltaSec的初始值显示为;“未定义”;,javascript,undefined,setinterval,Javascript,Undefined,Setinterval,我遇到问题,因为此deltaSec变量始终在内部重置: if(typeof deltaSec === "undefined"){...} 正如您所看到的,甚至尝试在条件中解析整个损耗,以保证它是“number”类型 这个验证deltaSec类型是否为“number”的条件是我开始发现问题之前的第一个条件(typeof deltaSec==“undefined”)“else” timeLineUpdater = setInterval(function (){ var arrayTd =

我遇到问题,因为此deltaSec变量始终在内部重置:

if(typeof deltaSec === "undefined"){...}
正如您所看到的,甚至尝试在条件中解析整个损耗,以保证它是“number”类型

这个验证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,也是代码示例的预期行为

在词法块内的任何位置(在本例中,
函数(){}
)以
var
开头的变量声明被提升到块的开头。您可以通过以下方式说服自己(观看控制台):

setInterval(函数(){
控制台日志(“分配前”);
console.log(globalElement);
var globalElement=“bar”;
console.log(globalElement);

}, 1000);
我认为您应该将
constructionTime
deltaSec
声明在setInterval处理程序函数的范围之外。代码中发生的事情是,在if子句的作用域内声明变量,而在该作用域外它们不可见。顺便说一句,为什么
deltaSec=deltaSec在else子句中。那没用。我认为您的代码应该是这样的,尽管我不确定您在这里想做什么

var deltaSec;
var构造时间;
var timeLineUpdater=setInterval(函数(){
var arrayTd=document.getElementsByClassName(“someclass”);
constructionTime=document.getElementById(“elementId”).value;
deltaSec=60-parseInt(constructionTime.split(“:”[2]);
控制台日志(deltaSec);
控制台日志(deltaSec类型);
如果(deltaSec==0){
//做点什么
deltaSec=60;
}

},1000);
如何初始化
deltaSec
以及在何处?看起来
deltaSec
是一个全局变量,或者至少是一个非本地变量。是否有可能在调用超时之间更改其值?(因为这就是它看起来的样子——没有更多的代码是不可能知道的。)它在被标识为未初始化后立即被初始化。。。第15行。哪里有
var deltaSec
定义?否则它将始终是未定义的。已经说过它在第15行。“var deltaSec=parseInt(60-parseInt(constructionTime.split(“:”[2]);”@MihailMinkov考虑到您提出的见解,我如何仅在第一次运行此函数时分配此值?我知道我可以做一些事情,但是想要从函数内部控制一切。@GilkanSolizaris您是否尝试过将声明从if子句中删除?请不要将相关代码发布到第三方网站,因为这些链接可能会随着时间的推移而消失,然后您的答案/解释将变得毫无意义。只需将演示代码放在堆栈溢出中的“代码段”中即可。@ScottMarcus感谢您的提醒!上次我正确地回答了问题,所以这个功能不存在。从现在起,我肯定会更多地使用它。@GilkanSolizaris您确实需要使用变量声明,否则您将隐式创建一个全局变量,这应该始终避免。@ScottMarcus不正确。一个
var
声明就足以阻止全局变量被访问。His在第二个
if
中。显然,他的意图是使用全局变量(他的代码意图是将某个内容延迟60秒,而
setInterval
用于检查/强制执行此延迟)。我的解释完全围绕着为什么这不起作用,以及纠正它的一个步骤。@GilkanSolizaris进一步阐述,当您使用
var
声明变量时,实际上是在告诉解释器在局部范围内为该变量提供一些空间。范围一结束,变量就消失了。但是,在该范围内,您可以随意使用/重用该变量。顺便说一句,我很确定我们都被这件事咬过:-)