Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript函数:从上次尝试到现在已经过了半秒了吗?_Javascript_Time_Timestamp_Overflow - Fatal编程技术网

Javascript函数:从上次尝试到现在已经过了半秒了吗?

Javascript函数:从上次尝试到现在已经过了半秒了吗?,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 }

我想构建一个函数,如果它在半秒钟前被调用,它将返回false

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;

   }

}