Javascript 检查全局变量值在过去N秒内是否已更改
我试图编写一些Javascript来检查全局变量的值在过去10秒内是否发生了变化。我的第一个想法是使用Javascript 检查全局变量值在过去N秒内是否已更改,javascript,Javascript,我试图编写一些Javascript来检查全局变量的值在过去10秒内是否发生了变化。我的第一个想法是使用setTimeout,如下所示: var glob = 0; //global variable which the user can change by clicking a button //the following code is my attempt to check if glob has changed values in a 10-second period var tmp
setTimeout
,如下所示:
var glob = 0; //global variable which the user can change by clicking a button
//the following code is my attempt to check if glob has changed values in a 10-second period
var tmp_glob = glob;
setTimeout(function(){
if(tmp_glob == glob){
console.log("The value hasn't changed.");
}
}, 10000);
我的逻辑是,经过10秒后,Javascript将检查
glob
和tmp_glob
是否仍然相同,如果相同,则意味着glob
自tmp_glob
启动以来没有改变。但是,即使我从客户机更改了glob
,它也总是返回true。我100%确信glob
正在更改。那么为什么我的代码不起作用呢?或者,有谁能为我试图完成的任务提供更好的解决方案吗?当我在控制台中运行它时,它对我很有用。以下是一个屏幕截图:
您可以看到,我第一次运行glob时,glob没有改变,所以它输出的结果是没有改变的。第二次运行它时,我更改了glob,因此它会点击else语句。您在询问其他选项。在我看来,你不能说你对任何acton用户都是100%肯定的。如果他更改了9.9999s中的值,而您的脚本将其视为>10s,该怎么办 对我来说,最好将函数与事件配对,而不是使用interval/timeout。如果用户可以通过单击更改变量,那么最好只检查newValue(来自HTML内容)是否与您的变量不同 在我的示例中,我假设您有HTML表单,但即使在onClick事件上也可以触发该方法
var glob = 0;
var setGlobal = function() {
var value = parseInt(document.form.global.value); //value from document
if (value !== glob) {
alert('New value is different'); //if value is different, do what you want
}
glob = value; //oh, and remember to assign the new value :)
};
JSFiddle:您的代码运行得很好,但这是一种非常糟糕的做法,您的问题可能在于
tmp\u glob
被覆盖。使这一点更加可靠的一种方法是将您的setTimeout
封装在一个拥有tmp\u glob
变量的函数中:
function watchglob() {
var tmp_glob = glob;
setTimeout(function () {
if (tmp_glob == glob) {
console.log("The value hasn't changed.");
} else {
console.log("The value has changed");
tmp_glob = glob;
}
}, 10000);
}
现在,当您想开始监控时,只需调用:
watchglob();
但是您将无法从外部覆盖tmp\u glob
见:
如果要避免为此定义命名函数,可以使用立即调用函数表达式(IIFE):
(function() {
var tmp_glob = glob;
setTimeout(function () {
if (tmp_glob == glob) {
console.log("The value hasn't changed.");
} else {
console.log("The value has changed");
tmp_glob = glob;
}
}, 10000);
})();
您可能想要
setInterval
而不是setTimeout
setTimeout
只运行一次,因此除非在前10秒内更改变量,否则您将错过它。在何处/如何更改glob
的值?使用:window.setInterval(function(){if(tmp_glob==glob){console.log(“值未更改”);},10000)
@MattBurland不,我要setTimeout
。它只需要在某个事件后运行一次。十秒钟后,我们检查它是否改变了,就这样。@jovan如果它改变了,那说明是不正确的。看看我的小提琴。您很可能有时间/逻辑问题,而不是您提供的代码特有的问题。是的,我现在看到,我的问题可能在于调用重叠,因为客户端可能会发出多个请求,并在过程中覆盖tmp_glob
。