检查全局变量值是否在最后N秒内发生了变化

时间:2014-04-28 17:04:53

标签: 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_glob = glob;

setTimeout(function(){
    if(tmp_glob == glob){
        console.log("The value hasn't changed.");
    }
}, 10000);

我的逻辑是,经过10秒后,Javascript会检查globtmp_glob是否仍然相同,如果是,那就意味着glob还没有自tmp_glob启动以来已更改。但是,即使我从客户端更改glob,也始终返回true。我完全确定glob正在被更改。那么为什么我的代码不起作用呢?或者,任何人都可以为我想要完成的事情提供更好的解决方案吗?

3 个答案:

答案 0 :(得分:1)

当我在控制台中运行它时,它适用于我。这是一个截图:

enter image description here

你可以看到我第一次运行它时,glob没有改变,所以它输出它没有。我第二次运行它,我改变了glob,所以它命中了else语句。

答案 1 :(得分:1)

你在询问其他选择。在我看来,你不能说你100%肯定任何用户acton 。如果他更改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:http://jsfiddle.net/p4Yx5/1/

答案 2 :(得分:1)

您的代码运行得很好,但这种做法非常糟糕,您的问题可能会在tmp_glob被覆盖。使这个更加健壮的一种方法是将setTimeout括在一个拥有tmp_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_glob

请参阅:http://jsfiddle.net/aAn9J/2/

您可以使用立即调用的函数表达式(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);
})();