Javascript 检查全局变量值在过去N秒内是否已更改

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

我试图编写一些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_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