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