
原生JavaScript节流函数参数传递的正确方法
在使用原生JavaScript实现节流函数时,直接使用apply方法传递参数可能会导致函数提前执行,并非预期的节流效果。 以下分析并解决这个问题:
错误示例:
<code class="javascript">function sayHi(data) {
console.log(data + new Date().getSeconds());
}
function throttle(func, delay) {
let timer = null;
return function() {
const context = this;
const args = arguments;
if (!timer) {
timer = setTimeout(() => {
func.apply(context, args); // 问题在此行
timer = null;
}, delay);
}
};
}
window.addEventListener('resize', throttle(sayHi('abc'), 2000)); // sayHi立即执行</code>上述代码中,throttle(sayHi('abc'), 2000) 会立即执行 sayHi('abc'),throttle 函数接收到的 func 实际上是 sayHi('abc') 的返回值 (undefined),导致节流失效。
立即学习“Java免费学习笔记(深入)”;
正确方法:
为了避免函数提前执行,我们需要创建一个闭包,将参数传递给节流函数内部的匿名函数:
<code class="javascript">function sayHi(data) {
console.log(data + new Date().getSeconds());
}
function throttle(func, delay) {
let timer = null;
return function(...args) { // 使用rest参数接收参数
const context = this;
if (!timer) {
timer = setTimeout(() => {
func.apply(context, args);
timer = null;
}, delay);
}
};
}
window.addEventListener('resize', throttle(sayHi, 2000)); // 正确的调用方式
window.dispatchEvent(new Event('resize')); //触发resize事件测试
//传递参数的方式
window.addEventListener('resize', throttle(function(){sayHi('abc')},2000));</code>在这个改进后的版本中:
...args (rest参数) 来接收传递给节流函数的所有参数。sayHi 函数本身作为参数传递给 throttle 函数,而不是立即执行它。setTimeout 回调函数中,func.apply(context, args) 正确地将参数应用于 sayHi 函数。现在,sayHi 函数只会在 setTimeout 延迟后执行,实现了正确的节流功能。 第二个window.addEventListener例子展示了如何传递参数给sayHi函数。 记住要触发一个resize事件来测试节流效果。
以上就是JavaScript节流函数中如何正确传递参数?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号