关于 JavaScript 的 “事件对象” 的问题

关于“事件对象”一直有个地方不能理解。

直接上代码:


<!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>test</title>
        <style type="text/css">
            #test{
                width: 400px;
                height: 400px;
                background-color: blue;
            }
            #child{
                width: 200px;
                height: 200px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div id="test">
            <div id="child"></div>
        </div>
        <script type="text/javascript">
            let action = function(e){
                console.log(this);
            }
            document.getElementById("test").onclick = action;
        </script>
    </body>
</html>

此时,点击 test 会触发事件action 输出结果为(截图不全,表示<div id="test"> 这个节点):
图片描述

此时,我通过事件对象,获取到了我想要的DOM,即<div id="test">

此时的this相当于e.currentTarget(不是很清楚的同学可以看下面的链接,讲的还是比较详细的:链接描述


现在修改代码为(<script>标签内):

 <script type="text/javascript">
            let action = function(item){
                console.log(this);
            }
            document.getElementById("test").onclick =() => action("lalala");
        </script>

此时的this并不是我想要的节点,而是全局windows对象。

这个问题是关于事件对象的。

在上述情况,我并没有获取到我想要的节点。

之前在本网站有搜索到关于事件对象的问题,但是没有看到我这种情况的解决方法

综上,我的问题是:
在后者情况下,如何获取事件对象,从而获取我想要的节点

希望有知晓的大佬能提出解决方案,最好能附上简单的例子,

不胜感激!!!

阅读 3.8k
5 个回答

箭头函数内部的this是从外层this,本身不记录this
你实在想用箭头函数可以call或者apply一下改变作用域就行了:

var test = document.getElementById("test");
test .onclick =() => action.call(test);
document.getElementById("test").onclick = action;

这段代码相当于:

document.getElementById("test").onclick = function(e){
    console.log(this);
};

其中的this指向触发onclick事件的对象。

document.getElementById("test").onclick = () => action("lalala");

而这段代码相当于:

document.getElementById("test").onclick = function() {
    return action("lalala");
};

也就是:

document.getElementById("test").onclick = function(e) {
    return function(str) {
        console.log(this);
    }("lalala");
};

这时你返回了一个由闭包构成的立即执行函数,在这个立即执行函数中,this指向全局的Window对象。

说直白些 就是es6的箭头函数不会改变this的指向 ,默认指向window
最简单的实现方式就是使用apply call来绑定this
楼上已经表述的很清晰了

题主箭头函数里面返回一个函数,这里面的函数this当然是返回window

document.getElementById("test").addEventListener('click',action,false)

//或者

document.getElementById("test").onclick = action
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏