JS防抖代码解读

html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./js之防抖.js"></script>
</head>
<body>
  <div id="container">0</div>
</body>
</html>

js

function debounce3(func, wait) {
  var timeout;
  return function() {
    var context = this;
    var args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(function() {
      func.apply(context, args);
    }, wait);
  }
}

window.onload = function() {
  var count = 1;
  var container = document.getElementById("container");

  function getUserAction(e) {
    container.innerHTML = count++;
    console.log(e, this);
  }

  container.onmousemove = debounce3(getUserAction, 1000);
};

问题1:为什么 var context = this;中的this指向的是<div id="container">0</div>?
问题2:为什么 var args = arguments;可以接收到鼠标对象?如果不把arguments参数传递回来,getUserAction 中的e就是undefined?

阅读 1.5k
1 个回答
  1. 在宿主对象上调用的函数,其默认 this 指向宿主对象,你这里的宿主对象是 container,所以 onmousemovethis 就是 container,而本质上,onmousemove 就是 debounce3 (debounce3所返回的函数),又由于 debounce3 内部手动绑定了 getUserAction 函数 this 的指向,所以这里也指向 container
  2. 第二点的话算是比较基础的东西了,首先 arguments 代表的是当前函数所有接受到的参数,这个参数你如果直接在 func.apply(context, arguments); 中使用的话,这个 arguments 指的是 setTimeout 的那个回调函数接受到的参数,很显然是 undefined

个人看法,有误轻喷。

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