节流函数的作用是在限定的时间内函数只执行一次,比如:
1.按钮提交(可以避免重复提交,当然不只这种方法,将按钮设置为不可用也可以)。
2.scroll、mousehover、mousemove等触发频率高的时候。
主要的原理就是在闭包内设置一个标记,在限定的时间内这个flag设置为true,函数再次点击则不让执行,setTimeout函数执行以后将flag设置为flase,就可以继续执行 。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<style>
*{
margin:0;padding:0;
}
</style>
</head>
<body>
<div class="box" id="div_box" >
<button onclick="fn1()">test</button>
</div>
</body>
<script>
//节流函数
function throttle(fn,delay){
var flag=false;
var timer=null;
return function(){
var args=[].slice.call(arguments,0);//将参数转成数组
var context=this;
if(flag){//如果在限定的时间内 flag是true 则直接返回,不让执行
return;
}
flag=true; //函数正在控制中
//执行函数
fn.apply(context,args);
clearTimeout(timer);//清除定时器
timer =setTimeout(function(){
flag=false;//延时时间过了以后,放开函数控制
},delay)
}
}
function fn(){
console.log(123);
}
var fn1 = throttle(fn,2000);//绑定节流函数
</script>
</html>