关于js防抖的一些疑问

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="box" onclick="fangDou(handle, 1000)">点我点我点我</button>
    <script>
        let box = document.getElementById("box");
        function handle() {
            console.log(111);
        }

        function fangDou(fun, timer) {

            var time = null
            return () => {
                console.log(time)
                clearTimeout(time)
                time = setTimeout(() => {
                    fun.apply(this, arguments)

                }, timer)
            }
        }
         box.addEventListener("click", fangDou(handle, 1000))
    </script>
</body>

</html>

为什么使用onclick调用防抖无反应,而使用addEventListener则可以顺利使用? 两个方法不是一样吗?### 题目描述

阅读 1.6k
2 个回答

把最后一句改成:

box.addEventListener("click", () => fangDou(handle, 1000));

这样一来两种方式的结果就一样了:都没反应。
这种防抖函数(生成器)的原理是 fangDou 每执行一次返回一个受 time 变量控制的函数。addEventListener 后面的 fangDou 加了个括号,所以它会在解析的时候执行,返回的这个函数作为点击事件的回调函数,没毛病;而 onclick 的回调函数直接就是 fangDou ,每次点击都只会返回受控的函数,而这个受控的函数没有执行,所以没有反应。
如果要使 onclick 也防抖,应该在脚本里执行一遍 fangDou,把返回的函数作为 onclick 时调用的函数即可:

<!-- HTML 里-->
<button id="box" onclick="clickHandler()">点我点我点我</button>
// JS 里
window.clickHandler = fangDou(handle, 1000);

其实是需要的条件不一样而已,
box.addEventListener('click', func), 其中func只要是个函数就可以了.

click你需要执行一个函数,
比如:
onClick="func" 是无效的
onClick="func()"才有效

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题