Javascript setInterval始终将deltaSec的初始值显示为;“未定义”;
我遇到问题,因为此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 =
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
声明变量时,实际上是在告诉解释器在局部范围内为该变量提供一些空间。范围一结束,变量就消失了。但是,在该范围内,您可以随意使用/重用该变量。顺便说一句,我很确定我们都被这件事咬过:-)