+
95
-

js中的函数节流(throttle)与函数去抖(debounce)有什么区别?

请问js中的函数节流(throttle)与函数去抖(debounce)有什么区别?

网友回复

+
15
-

函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段。

函数节流是指一定时间内js方法只跑一次。比如人的眨眼睛,就是一定时间内眨一次。这是函数节流最形象的解释。

函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。

函数节流

函数节流应用的实际场景,多数在监听页面元素滚动事件的时候会用到。因为滚动事件,是一个高频触发的事件。以下是监听页面元素滚动的示例代码:
// 函数节流
var canRun = true;
document.getElementById("throttle").onscroll = function(){
 if(!canRun){
  // 判断是否已空闲,如果在执行中,则直接return
  return;
 }

 canRun = false;
 setTimeout(function(){
  console.log("函数节流");
  canRun = true;
 }, 300);
};

函数节流的要点是,声明一个变量当标志位,记录当前代码是否在执行。 如果空闲,则可以正常触发方法执行。 如果代码正在执行,则取消这次方法执行,直接return。 这个方法的作用是监听ID为throttle元素的滚动事件。 当canRun为true,则代表现在的滚动处理事件是空闲的,可以使用。 通过关卡if(!canRun),等于就拿到了通行证。然后下一步的操作就是立马将关卡关上canRun=false。这样,其他请求执行滚动事件的方法,就被挡回去了。 接着用setTimeout规定最小的时间间隔300,接着再执行setTimeout方法体里面的内容。 最后,等setTimeout里面的方法都执行完毕,才释放关卡canRun=true,允许下一个访问者进来。 这个函数节流的实现形式,需要注意的是执行的间隔时间是>=300ms。如果具体执行的方法是包含callback的,也可以将canRun=true这一步放到callback中。理解了函数节流的关卡设置重点,其实改起来就简单多了。

函数防抖

 函数防抖的应用场景,最常见的就是用户注册时候的手机号码验证和邮箱验证了。只有等用户输入完毕后,前端才需要检查格式是否正确,如果不正确,再弹出提示语。以下还是以页面元素滚动监听的例子,来进行解析:
// 函数防抖
var timer = false;
document.getElementById("debounce").onscroll = function(){
 clearTimeout(timer); // 清除未执行的代码,重置回初始化状态

 timer = setTimeout(function(){
  console.log("...

点击查看剩余70%

+
15
-

函数写法

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">

    <title>函数节流和函数防抖</title>
    <style>
        .demo {
            width: 200px;
            height: 200px;
            border: 1px solid red;
            overflow-y: scroll;
            margin-top: 50px;
        }
        .scroll {
            height: 5000px;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div id="nothing" class="demo">
            普通滚动
            <div class="scroll"></div>
        </div>
        <div id="throttle" class="demo">
            函数节流
            <div class="scroll"></div>
        </div>
        <div id="debounce" class="demo">
            函数防抖
            <div class="scroll"></div>
        </div>
    </div>
    <script type="text/javascr...

点击查看剩余70%

我知道答案,我要回答