ES6中function和箭头函数的this指向问题

  • 首先我们看一下下面这个代码:
const obj = {
    aaa() {
        setTimeout(function(){
            console.log(this) // windows
        }, 1000)

		console.log(this) // obj对象

        setTimeout(() =>{
            console.log(this) // obj对象
        })
    }
}

问题:箭头函数中的this是如何查找的了?
答案:向外层作用域中,一层一层查找this,直到有this的定义。

对于第一个setTimeout,由于function在调用的时候是通过callback,会把windows当做第一个参数传进去,所以第一个this指向windows;第二个是通过箭头函数的形式没有参数传进去,所以向上一层查找this,也就是obj对象。

  • 根据上述结论看下面的代码:
const obj = {
    aaa() {
        setTimeout(function(){
            /* 1 */
            setTimeout(function(){
                console.log(this) // windows
            }, 1000)

            /* 2 */
            setTimeout(() => {
                console.log(this) // windows
            }, 1000)
        }, 1000)

        setTimeout(() =>{
            /* 3 */
            setTimeout(function(){
                console.log(this) // windows
            }, 1000)

            /* 4 */
            setTimeout(() => {
                console.log(this) // obj
            }, 1000)
        })
    }
}

上述代码的this指向:

  • 第一个不用多说,只要是setTimeout里面function都是传递windows对象;
  • 第二个向setTimeout外面一层找,发现在上一个setTimeout的function中,所以还是windows;
  • 第三个同第一个,还是windows;
  • 第四个箭头函数上面一层还是箭头函数,而箭头函数的调用者是obj,所以是obj。

结论:
只要是setTimeout/setTimeInterval,其中回调函数是用function(){}形式写的,其中的this都指向windows;传递函数不是通过回调函数的方式调用,所以其作用域应该向上一层找,直到找到有this定义。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值