// 待补充完整
在 jsx 中绑定的事件,根本就没有注册到真实的 dom 上。是绑定在 document 上统一管理的。
真实的 dom 上的 click 事件被单独处理,已经被 react 底层替换成空函数。
在 react 绑定的事件,比如 onChange,在 document 上,可能有多个事件与之对应。
react 并不是一开始,把所有的事件都绑定在 document 上,而是采取了一种按需绑定,比如发现了 onClick 事件,再去绑定 document click 事件。
handlerClick = (e) => {
console.log(e.target) // button
setTimeout(()=>{
console.log(e.target) // null
}, 0)
}
releaseTopLevelCallbackBookKeeping
等方法将事件源对象释放到事件池中,这样的好处每次我们不必再创建事件源对象,可以从事件池中取出一个事件源对象进行复用,在事件处理函数执行完毕后,会释放事件源到事件池中,清空属性,这就是 setTimeout 中打印为什么是 null 的原因了。**