JavaScript函数节流和防抖

在我们使用的浏览器中,用户可以使用通过高频率的点击来触发开发人员写的代码,就比如抢购按钮的疯狂点击;这些高频率的操作会降低浏览器的运行速度,浪费了资源,在网络请求中还会给服务器带来很大的压力,所以我们可以通过让函数节流和函数防抖操作,来提高网页中的性能。

函数节流

<script>
	function throttle(fn,timeout){
    
    
		// 需要使用变量将上一次触发的时间存储起来,这里存储在函数的静态成员中
		if(throttle.lastTime === undefined){
    
    
			throttle.lastTime = 0;
		}
		// 获取到当前的时间戳
		let currentTime = new Date().getTime();
		if(currentTime-throttle.lastTime > timeout){
    
    
			// 执行对应的函数
			fn();
			// 将当前的时间存储起来
			throttle.lastTime = currentTime;
		}
	}
</script>

测试代码:

<script>
	var i = 0;
	window.onclick = function() {
    
    
		throttle(function() {
    
    
			i++;
			console.log('鼠标点击了' + i + '次');
		}, 1000)
	};
</script>

除此之外JavaScript还有一些触发频率极高的事件,比如鼠标移动事件(onmousemove)、滚动条事件(onscroll)和窗口变化大小事件(onresize)

函数防抖

一般来说用户的鼠标误操作会导致前端代码的误触发,我们则可以认为在某个元素上停留时间长短来判断是否误操作,决定是否继续执行代码,我们可以使用setTimeout来实现。

<script>
	function debonce(fn,timeout){
    
    
		// setTimeout的id存储到函数的静态成员中,不会造成变量的全局污染
		clearTimeout(debonce.timeId);
		debonce.timeId = setTimeout(fn, timeout);
	}
</script>

测试代码:

<script>
	let i = 0;
	window.onmousemove = function() {
    
    
    	debonce(function() {
    
    
        	i++;
	        console.log('鼠标移动了' + i + '次');
    	}, 1000)
	};
</script>

猜你喜欢

转载自blog.csdn.net/cautionHua/article/details/114258795