使用 setInterval 时,变量在全局范围内不会更新



我想编写一个函数,该函数将返回一个变量,我可以在另一个函数中使用。另一个函数应该使用当前时间和其他选定时间之间的时间比较。我想我可以通过使用 return 和属性使时间变量在全局范围内可访问,并使用setInterval()更新它。

不幸的是,当我将变量"导入"到另一个函数时,时间变量没有更新。

为什么不console.log('time cool outside' + obj.debug );返回与console.log('time cool inside' + timeCool);

function checkTime(i) {
if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
return i;
}
function timeFunction() {
let today = new Date();
let hours = today.getHours();
let minutes = today.getMinutes();
minutes = checkTime(minutes);
hours = checkTime(hours);
let stringHours = hours.toString();
let stringMinutes = minutes.toString();
time = stringHours + stringMinutes;
let timeCool = parseInt(time);
console.log('time cool inside' + timeCool);
return {
debug: timeCool,
};
}
let obj = timeFunction();
setInterval(timeFunction, 5000);
function a() {console.log('time cool outside' + obj.debug );}
setInterval(a, 5000);

在行中

let obj = timeFunction();
setInterval(timeFunction, 5000);

创建一个全局对象obj并将其设置为timeFunction的输出。然后使用setInterval,您可以定期调用timeFunction,但从不obj设置为其输出。因此,当a访问obj时,它永远不会改变

让我们看看你在这里做什么:

let obj = timeFunction();

在这里,您调用timeFunction并将其结果存储到obj中。

setInterval(timeFunction, 5000);

在这里,您每 5 秒调用一次timeFunction。返回值被忽略。

function a() {console.log('time cool outside' + obj.debug );}

这里有一个新函数,它引用了之前定义的obj变量。obj是第一次调用timeFunction的返回值,并且从未更改过,因此无论您调用这两个函数中的任何一个的频率如何,它都将始终具有相同的值。

如果要更新obj则需要在timeFunction中执行此操作或继续将其设置为返回值timeFunction

谢谢你们的帮助。事实上,我没有注意到我没有更新"obj"变量。

实现此操作后:

let obj;
function objUpdate() {
obj = timeFunction();
}
setInterval(objUpdate, 1000);

一切看起来都像我想要:) 谢谢大家!

最新更新