今天給大家介紹一下js函數節流吧!
什么是javascript函數節流?從其字面意思可以大概猜到是一種為提升函數調用執行性能的一種方法。javascript函數節流就是針對調用頻率高的函數,通過設置定時器,使其在執行后間隔一段時間,才進行下一次的執行,避免重復頻繁的調用導致的瀏覽器性能以及ajax重復調用問題。
函數節流的經典應用場景:onresize,scroll,mousemove ,mousehover等事件回調函數的無間斷執行。其主要實現思路就是通過setTimeout定時器,通過設置緩沖時間,在第一次調用時,創建定時器,并在定時時間結束調用。第二次調用時,會清除前一個定時器并設置新的定時器。如果這時前一個定時器暫未執行,則將其替換為新的定時器。目的在于在一定的時間內,保證多次函數的請求只執行最后一次調用。我們看一個簡單實現。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>函數節流</title>
<style>
body{
height: 2000px;
}
</style>
</head>
<body>
<script>
window.onscroll = function (argument) {
console.log("函數調用");
}
</script>
</body>
</html>
上面這段代碼時間線的結果在滾動頁面時,頻繁觸發了多次的函數調用,如果函數調用中涉及到了dom操作或者接口請求的話,那將是一個惡夢。
下面通過加入函數節流的方法:
<script>
window.onscroll = function(){
console.log("scroll滑動");
throttle(count);
}
function count(){
console.log("函數調用");
}
function throttle(method, context){
clearTimeout(method.tId)
method.tId = setTimeout(function(){
method.call(context);
}, 300);
}
</script>
這樣只有在停止滑動后,定時結束才執行函數處理邏輯。
但是如果我想在滑動的時候,隔一段時間,不管有沒停止滑動,都要執行處理邏輯,而不是像上面一樣要等到停止之后才調用,該如何實現呢?
var time = +new Date();
function count(){
console.log("函數調用:" + (+new Date()-time));
}
var throttle = function(fn, delay, mustRun){
var timer = null,
previous = null;
return function(){
var now = +new Date(),
context = this,
args = arguments;
if (!previous ) previous = now;
var remaining = now - previous;
if(mustRun && remaining >= mustRun){
fn.apply(context, args);
previous = now;
}else{
clearTimeout(timer);
timer = setTimeout(function(){
fn.apply(context, args);
}, delay);
}
}
}
window.onscroll = throttle(count, 500, 1000);
這樣我們就適合于需要頻繁調用,但又在一定的時間內必須要執行邏輯的場景。
總結: 巧用函數節流方式能夠顯著得提高頁面性能以及交互體驗,歡迎大家一起探討。