function debouse(fn, delay = 2000) { let timer = 0; // 防抖函数 return function () { if (timer) clearInterval(timer) timer = setTimeout(() => { fn.apply(this.arguments) // 遗传this和参数 timer = 0 }, delay) } } const input1 = document.getElementById('input1') // input1.addEventListener('keyup', debouse(() => { // console.log('发起搜索:' + input1.value); // })) input1.addEventListener('keyup', () => { console.log('发起搜索:' + input1.value); })
时间: 2024-02-10 13:33:02 浏览: 38
这段代码是一个 JavaScript 实现的防抖函数,函数名为 `debouse`。它接受两个参数,第一个是需要执行的函数 `fn`,第二个是延迟时间 `delay`,默认为 2000 毫秒。
当这个防抖函数被调用时,它会返回一个新的函数。每当新返回的函数被调用时,它会清除之前设置的定时器 `timer`,并重新设置一个新的定时器,延迟时间为 `delay`。如果在延迟时间内再次调用该函数,则会清除之前的定时器并再次设置新的定时器。当定时器到期时,会执行传入的函数 `fn`,并将传入的参数和 `this` 遗传给它。
在这段代码中,我们将防抖函数应用在了一个搜索框的输入事件上。当用户在这个搜索框输入内容时,会触发输入事件,并打印出当前输入框中的值。使用防抖函数可以避免用户频繁输入时触发过多的事件,降低了服务器的压力。
相关问题
function throttle(fn, delay) { let timer = null; return function () { if (!timer) { fn(); timer = setTimeout(function () { timer = null; // 清楚定时器 }, delay) } } }
这是一个经典的函数节流(throttle)实现,接收两个参数:一个是需要节流的函数 fn,另一个是节流时间间隔 delay。该函数的作用是在一定时间间隔内,只执行一次函数 fn,而忽略之后的所有调用。具体实现是通过闭包及 setTimeout 函数实现的。如果在 delay 时间间隔内多次调用该函数,只有第一次调用会执行 fn,之后的调用都会被忽略。这种技术常常被用于 DOM 事件的处理,以减少频繁触发事件而带来的性能问题。
TC7 = TIMER_PERIOD; // 设置定时器计数值出错
很可能是因为`TIMER_PERIOD`的数据类型不匹配而导致设置定时器计数值出错。在S9S12G128芯片中,定时器计数器的计数值是一个16位无符号整数,范围是0x0000~0xFFFF。因此,如果`TIMER_PERIOD`的数据类型不是16位无符号整数,就会导致设置定时器计数值出错。
要解决这个问题,可以将`TIMER_PERIOD`的数据类型改为16位无符号整数,即`unsigned int`或`uint16_t`。同时,为了避免数据类型不匹配的问题,可以将定时器计数值直接赋值给`TC7H`和`TC7L`寄存器,而不是使用`TC7`寄存器。具体代码如下:
```
#define TIMER_PERIOD 8000 // 定时器计数值
void timer_init(void);
interrupt VectorNumber_Vtimch7 void timer_isr(void);
void main(void) {
timer_init(); // 初始化定时器
EnableInterrupts; // 开启全局中断
for(;;) {
// 主循环中可以执行其他操作
}
}
void timer_init(void) {
TSCR1 = 0x80; // 启动定时器,使用内部总线时钟
TSCR2 = 0x00; // 设置定时器时钟分频系数为1,不使用输出比较功能
TIOS |= 0x80; // 设置定时器7为输出比较模式
TC7H = TIMER_PERIOD >> 8; // 设置定时器计数值的高8位
TC7L = TIMER_PERIOD & 0xFF; // 设置定时器计数值的低8位
TIE |= 0x80; // 开启定时器7的中断
}
interrupt VectorNumber_Vtimch7 void timer_isr(void) {
TFLG1 |= 0x80; // 清除定时器7中断标志位
// 在这里执行需要定时执行的操作
}
```
在上述代码中,首先将`TIMER_PERIOD`的数据类型改为了`unsigned int`,并将其值设为8000,即定时器计数值的1/1000。然后在`timer_init()`函数中,将定时器计数值的高8位和低8位分别赋值给`TC7H`和`TC7L`寄存器。最后开启定时器7的中断。
这样做可以避免数据类型不匹配的问题,同时也可以提高代码的可读性和可维护性。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)