关于箭头函数this的指向问题

关于箭头函数的this指向,我一直是用的阮一峰大大的判断准则:图片描述

但是今天无意中做了一段测试代码,却把自己绕懵了:

  <body>
    <div id="d1">1
    </div>
  </body>
<script>
    let obj ={
        name:"obj",
        test1:function(){
            document.getElementById("d1").addEventListener("click",()=>{
                console.log("test1",this);
            })
        },
        test2:()=>{
            document.getElementById("d1").addEventListener("click",()=>{
                console.log("test2",this);
            })
        },
        test3:()=>{
            console.log("test3",this);
        }
    }
    obj.test3();
    obj.test1();
    obj.test2();
</script>

结果:图片描述

按照阮大大的准则,test3应该输出obj这个对象才是,test1和test2的结果更是让我大脑宕机了,我现在完全

搞不懂为什么会出现这样的结果,求大佬指点。

阅读 3.5k
5 个回答

箭头函数中没有this绑定,必须通过查找作用域来确定其值,简单来说就是this绑定的是最近一层非箭头函数的this。
1、test1中的箭头函数的this指向的是test1函数内部绑定的this,即obj
2、test2中的箭头函数的外层还是箭头函数,得再往外找一层,找到了obj的外层,即window
3、test3中的箭头函数的外层是obj的外层,即window
其实test2与test3是一样的,不管在方法里面嵌套几层箭头函数
楼主要搞清楚的是test1,test2,test3是obj的一等方法,再往上就是obj的外面了, 不在obj内部了。

不清楚这句话怎么理解,反正肯定是运行时决定this的值。(这点跟箭头函数无关)

let test = function() {
    console.log(this)
}

test();//window

let obj = { test }

obj.test();//obj

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this

this就几种情况:

  1. new,指向新对象。
  2. bind/apply/call,指向第一个参数(如果第一个参数是null则指向window)。
  3. 作为对象的方法调用,指向对象。
  4. 函数调用,指向window

请重新对照上面规则确定你的this,此外站内无数文章都介绍了this,请自行搜索。

箭头函数运行之前就已经确定指向了吧,没有 this,绑定的就是最近外一层非箭头函数的 this

test4: function () {
                console.log("test4", this);
            
        }//obj

假设是正常函数时this指向obj,因为没有箭头函数没有绑定,所以再寻找上一层就是window

这个准则写得看上去有歧义似的。。
箭头函数没有 thisthis 值会从父级作用域——祖父级作用域——...一直向上找到全局作用域。(可以看成变量的查找顺序)

test1 里打印的this,等价于父级作用域 test1 里的 this
test2、test3 里打印的this,等价于一直往上找到的全局作用域里的 this

clipboard.png

都在图里了

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