setInterval 始终将 deltaSec 的初始值显示为 "undefined"
setInterval always showing initial value of deltaSec as "undefined"
我遇到了问题,因为这个 deltaSec 变量总是在内部被重置:
if(typeof deltaSec === "undefined"){...}
甚至尝试对条件内的整个属性进行 parseInt 以尝试保证其为 "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
开头的变量声明(在本例中为 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
if 检查,将 deltaSec
设置为整数。
您的下一个 console.log
(在 if 语句之后)然后将其打印为整数。
在下一个循环中,此行为重新开始,因为该变量没有在其他地方持续存在。
如果您想摆脱这种行为,请删除 deltaSec
赋值前的 var
。
我认为您应该在 setInterval 处理函数的范围之外声明 constructionTime
和 deltaSec
。您的代码发生的情况是您在 if 子句的范围内声明变量,并且它们在该范围之外不可见。顺便说一句,为什么在 else 子句中使用 deltaSec = deltaSec;
。那什么都不做。我认为您的代码应该看起来像这样,但我不确定您要在这里做什么。
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);
我遇到了问题,因为这个 deltaSec 变量总是在内部被重置:
if(typeof deltaSec === "undefined"){...}
甚至尝试对条件内的整个属性进行 parseInt 以尝试保证其为 "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
开头的变量声明(在本例中为 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
if 检查,将 deltaSec
设置为整数。
您的下一个 console.log
(在 if 语句之后)然后将其打印为整数。
在下一个循环中,此行为重新开始,因为该变量没有在其他地方持续存在。
如果您想摆脱这种行为,请删除 deltaSec
赋值前的 var
。
我认为您应该在 setInterval 处理函数的范围之外声明 constructionTime
和 deltaSec
。您的代码发生的情况是您在 if 子句的范围内声明变量,并且它们在该范围之外不可见。顺便说一句,为什么在 else 子句中使用 deltaSec = deltaSec;
。那什么都不做。我认为您的代码应该看起来像这样,但我不确定您要在这里做什么。
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);