我试图编写一些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。我完全确定glob
正在被更改。那么为什么我的代码不起作用呢?或者,任何人都可以为我想要完成的事情提供更好的解决方案吗?
答案 0 :(得分:1)
当我在控制台中运行它时,它适用于我。这是一个截图:
你可以看到我第一次运行它时,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);
})();