this默认指向当前触发事件的元素(即currenttarget),内联onclick和addeventlistener普通函数中均如此;箭头函数继承外层this,bind会固定this;event.target是原始触发元素,推荐用event.currenttarget替代this以避免混淆。

在 JavaScript 的 DOM 事件中,this 默认指向**当前触发事件的元素(即事件目标)**,但前提是事件处理函数是作为元素的属性直接绑定(如 onclick),或通过 addEventListener 绑定且未被显式改变上下文(比如没用 bind、箭头函数或 call/apply)。
原生 HTML 属性绑定时 this 指向触发元素
当使用内联事件属性(如 onclick)时,浏览器会把该属性值当作函数体执行,并自动将 this 设为当前元素:
<button onclick="console.log(this)">点我</button>
点击后输出的就是这个 <button></button> 元素本身。
addEventListener 中 this 默认也是触发元素
用 addEventListener 注册事件监听器时,只要传入的是普通函数(非箭头函数),this 就自动绑定为当前触发事件的 DOM 元素:
-
element.addEventListener('click', function() { console.log(this); });→this是element - 如果事件冒泡到父元素,且父元素也监听了同类型事件,那么在父元素的回调里,
this就是父元素(不是原始目标) - 想获取原始触发元素(比如子元素被点击),应使用
event.target;而this始终是绑定事件的那个元素(即currentTarget)
箭头函数和 bind 会改变 this 行为
箭头函数没有自己的 this,它会继承外层作用域的 this,所以不能依赖它指向 DOM 元素:
-
element.addEventListener('click', () => console.log(this));→this是定义时所在作用域的this(通常是window或模块顶层) - 用
fn.bind(obj)绑定后,this就固定为obj,不再指向元素 - 手动调用
fn.call(element, event)也能控制this,但通常没必要
实际开发中建议统一用 event.currentTarget
为避免混淆,尤其在事件委托或动态绑定场景下,推荐显式使用 event.currentTarget 替代 this,语义更清晰:
-
event.currentTarget等价于this(在标准函数中) -
event.target是真正触发事件的底层元素(可能嵌套) - 两者在事件冒泡中可能不同,例如点击子元素但监听在父容器上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











