JS 节流防抖

本文详细介绍了JavaScript中的防抖(debounce)和节流(throttle)概念,包括它们的工作原理,以及如何使用setTimeout、clearTimeout、apply、arguments和闭包等技术进行代码实现。
摘要由CSDN通过智能技术生成

一.防抖:

1.概念:

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

防抖是将多次执行变为最后一次执行,一个高频事件触发后 n 秒内函数只会执行一次,如果在 n 秒内高频事件再次被触发,则重新计算时间。这就像如果你正在等公交车,只要在等待时间内有人上车,公交车就会等到这个时间结束后才开走。

2.实现原理:

关键点:setTimeout 定时器 apply  arguments 闭包

setTimeout:

全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片段。

clearTimeout:

WindowOrWorkerGlobalScope 内置的 clearTimeout() 方法取消了先前通过调用setTimeout()建立的定时器。

apply:

 Function 实例的 apply() 方法会以给定的 this 值和作为数组(或类数组对象)提供的 arguments 调用该函数。

arguments:类数组

arguments 是一个对应于传递给函数的参数的类数组对象。

闭包:

闭包是在函数内部可以访问函数外部的变量。

        闭包就是函数内部可以访问外部的变量,即使外部函数已经执行完毕

        有一个缓存的变量不会被垃圾回收的效果

最简单的闭包现象

funciton fn() {
var a= a;
return function() {
console.log(a);//内部函数可访问外部变量
}

3.防抖具体代码实现 


function debounce(fn, times = 300, imediate = false) {
	let timer = null;
	// 定义全局判断上一次是否是立即执行
	let isVoke = false;

	const _debounce = function (...args) {
		if (timer) {
			clearTimeout(timer); //取消上一次定时器
			timer = null;//清除定时器缓存
		}
		if (imediate && !isVoke) {
			//!isVoke=true
			fn.apply(this, args);
			// imediate=false //立即执行完成之后改成false   分析问题 当下一次重新输入时  不会立即执行=>延迟执行
			isVoke = true; //这里赋值为true 当上一次执行完毕后赋值为true //让其延迟执行
		} else {
			//延迟执行
			timer = setTimeout(() => {
				//延迟执行
				fn.apply(this, args); //外部传入的函数 
				isVoke = false; //abcd=> 当abcd执行完后重启false   在判断是否立即执行
			}, times);
		}
	};
	return _debounce;
}

二.节流:

1.概念:

间隔 n 秒执行该事件,如果在 n 秒内重复触发,只有一次会生效

节流是在一定时间间隔内,只允许事件触发一次。如果在这个时间间隔内事件被多次触发,只有第一次会生效。这就像是电梯在固定的时间内只运行一次,无论这期间有多少人进入电梯。

2.实现原理:

Date.now() 

Date.now() 方法返回自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。

apply:

 Function 实例的 apply() 方法会以给定的 this 值和作为数组(或类数组对象)提供的 arguments 调用该函数。

闭包:

闭包是在函数内部可以访问函数外部的变量

节流具体代码实现

function throttle(fn, delay) {
	let prev = Date.now(); //当前时间戳

	return function () {
		let context = this,
			args = arguments,
			now = Date.now(); //new Date().getTime()

		if (now - prev >= delay) {
			fn.apply(context, args);
			prev = Date.now();
		}
	};
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS中的节流防抖是常用的优化性能的方法。它们的主要作用是控制函数的执行次数,从而提高页面的性能和用户体验。 ### 节流 节流(throttle)指的是在一定时间内只执行一次函数,也就是说在一段时间内,不管触发了多少次函数,函数只会执行一次。常用于限制一些高频事件的触发,比如页面滚动、鼠标移动等。 ```javascript function throttle(fn, delay) { let timer = null; return function() { if (!timer) { timer = setTimeout(() => { fn.apply(this, arguments); timer = null; }, delay); } } } ``` 上面的代码中,`throttle`函数接收两个参数,分别是要执行的函数和时间间隔,返回一个新的函数。每次调用该函数时,都会判断当前是否已经设置了定时器,如果没有,则设置一个定时器,在指定的时间间隔后执行函数,并将定时器置为null。 ### 防抖 防抖(debounce)指的是在一定时间内只执行最后一次触发的函数,也就是说当一个高频事件触发时,在一定时间内不断清除定时器,只有当最后一次触发事件后,定时器才会执行函数。常用于限制一些高频事件的触发,比如输入框输入、窗口大小改变等。 ```javascript function debounce(fn, delay) { let timer = null; return function() { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, arguments); }, delay); } } ``` 上面的代码中,`debounce`函数和`throttle`函数类似,也接收两个参数,分别是要执行的函数和时间间隔,返回一个新的函数。每次调用该函数时,都会清除之前设置的定时器,并重新设置一个新的定时器,在指定的时间间隔后执行函数。由于每次触发事件都会清除之前设置的定时器,只有最后一次触发事件后,定时器才会执行函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值