Javascript函数:从上次尝试到现在已经过了半秒了吗?
我想构建一个函数,如果它在半秒钟前被调用,它将返回falseJavascript函数:从上次尝试到现在已经过了半秒了吗?,javascript,time,timestamp,overflow,Javascript,Time,Timestamp,Overflow,我想构建一个函数,如果它在半秒钟前被调用,它将返回false timething.timechill=function(){ var last if (last){ if ((now.getTime()-last)>500){ return true } else{ return true }
timething.timechill=function(){
var last
if (last){
if ((now.getTime()-last)>500){
return true
}
else{
return true
}
}
else {
last=now.getTime()
return false
}}
有什么想法吗?我希望避免setTimeout(),如果输入太快而无法避免溢出,则忽略输入。这是一种好的做法吗?您定义的函数将始终返回
false
,因为最后一个
变量从未保存在任何地方。可以将其作为对象的属性保存,也可以将其保存在闭包中
下面是一个闭包示例:
timething.timechill = (function() {
var last = 0;
function timechill() {
var now;
now = new Date().getTime();
if (last) {
if (now - last > 500) {
// It's been long enough, allow it and reset
last = now;
return true;
}
// Not long enough
return false;
}
// First call
last = now;
return false;
}
return timechill;
})());
它使用匿名作用域函数来构建timechill
函数,作为last
变量的闭包。匿名作用域函数返回对timechill
函数的引用,该函数被分配给timething.timechill
。只有timechill
功能才能访问last
,它是完全私有的
(我确信函数的实际逻辑可以重构一点,但我认为这与您的原始逻辑非常接近,只是有一个地方您返回了true
,我认为您需要false
)
这是否是一个好主意完全取决于您的用例。我不会在上面忙着循环。:-)但如果你用它来弹出类似于SO的“你只能每五秒钟给一条评论打分一次”之类的东西,那就没问题了,尽管在这种情况下我可能会对它进行概括。timething.timechill=(函数(){
timething.timechill = (function () {
var lastCall = 0;
return function () {
if (new Date() - lastCall < 500)
return false;
lastCall = new Date();
//do stuff
}
})();
var lastCall=0;
返回函数(){
如果(新日期()-lastCall<500)
返回false;
lastCall=新日期();
//做事
}
})();
这里的想法是(function(){…})()
将创建一个匿名函数并立即运行它<代码>时间。timechill未分配此功能。相反,它被分配由该函数返回的内部函数
请注意,lastCall
未在该内部函数中声明(使用var
关键字)。当外部函数返回时,lastCall
不会消失,因为内部函数引用了变量,因此将其“封闭”
稍后运行timething.timechill
时,如果遇到此变量,它将在函数范围外搜索该变量,并找到先前声明的变量。当它返回时,变量仍然不会消失,因为它是在函数的作用域之外声明的
很难清楚地解释这个概念,但它非常有用,因为
lastCall
对于不需要查看它的其余代码是不可见的。我认为这不是一个好主意。根据您如何调用此方法,它可能会导致“无限循环”行为。使用setTimeout,您可以进行异步操作—在等待时间流逝时,您不会阻塞浏览器。大多数浏览器都会检测到阻塞代码并禁用脚本。最后一个变量必须存储在另一个对象中,例如全局变量的窗口对象或此处的时间对象。我从来没有听说过“现在”的物体
如果您愿意,可以在函数中用“窗口”替换“时间”
编辑:正如其他人所指出的,您还可以在闭包中保存_last_timechill变量。如果这是代码的复制粘贴,我建议您不要忘记放置“;”在你真正的代码上感谢所有伟大的答案!我会成为一个更好的js程序员,当我把我的头缠在他们身上的时候。顺便说一下,我第一次使用这个网站。那不好,是不是。。。如果我正确理解setTimeout,它只是等待执行脚本,对吗?如果时间太早,我需要“取消”,而不是推迟。。我遗漏了什么吗?谢谢你的回答。我试图避免“堆叠”多个鼠标滚轮事件,并让它们“滚动”,我在这里尝试了所有的解决方案,但它们都破坏了我的代码,原因是我摸不着头脑。最后你有“}()”;“我正在努力理解。Eclipse告诉我“左手边的赋值无效”,而我试图修复它的尝试没有奏效。。是的,汉克斯!我使用了你的代码,只做了一点小小的修改。我插入了这个else语句:else{lastCall=new Date();return true;}问题是,Date()调用是否会在以后引起问题?它只有在特殊情况下才会被调用。Kgianakakis是对的吗?setTimeout是解决这个问题的方法吗?
timething.timechill = function(){
if (!timething._last_timechill){
if ((new Date())-timething._last_timechill >= 500) return true;
else return false;
} else {
timething._last_timechill = new Date();
return false;
}
}