Javascript功能:自上次尝试以来已经过了半秒钟?

时间:2010-04-19 11:22:22

标签: javascript time timestamp overflow

我想构建一个函数,如果在半秒钟之前调用它,则返回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()并忽略输入,如果它太快以避免溢出。这是一个好习惯吗?

4 个答案:

答案 0 :(得分:5)

timething.timechill = (function () {
    var lastCall = 0;
    return function () {
        if (new Date() - lastCall < 500)
            return false;
        lastCall = new Date();
        //do stuff
    }
})();

这里的想法是(function() { ... })();将创建一个匿名函数并立即运行它。 timething.timechill未分配此功能。相反,它被此函数分配了内部函数返回

请注意,lastCall未在该内部函数中声明(使用var关键字)。当外部函数返回时,lastCall不会消失,因为内部函数由于引用变量而“封闭”了它。

当您稍后运行timething.timechill并遇到此变量时,它将在函数的范围外搜索变量并找到之前声明的变量。当它返回时,变量仍然不会消失,因为它是在函数范围之外声明的。

很难清楚地解释这个概念,但它非常有用,因为lastCall对于其他代码是不可见的,而不需要看到它。

答案 1 :(得分:1)

我不认为这是个好主意。根据您调用此方法的方式,它可能会导致“无限循环”行为。使用setTimeout,您可以进行异步操作 - 在等待时间过后,您不会阻止浏览器。大多数浏览器都会检测阻止代码并禁用您的脚本。

答案 2 :(得分:0)

您定义的函数将始终返回false,因为last变量永远不会保存在任何位置。您可以将其保存为对象的属性,也可以将其保存在闭包中。

这是一个闭包示例:

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我觉得你想要{{1} }}。)

这是否是一个好主意完全取决于您的用例。我不会忙于上面的循环。 :-)但是如果你用它来弹出类似SO的“你只能每五秒评一次评论”的东西,那就没关系了,尽管在那种情况下我可能会把它推广。

答案 3 :(得分:0)

“last”变量必须存储在另一个对象中,例如全局变量的window对象或此处的timething对象。我从来没有听说过“现在”的对象!?

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;

   }

}

如果您愿意,可以在函数中用“window”替换“timething”。

编辑:正如其他人指出的那样,你可以在闭包中使用你的_last_timechill变量。