对箭头函数中this的一些讨论

先看道题

var obj = {
    hi: function(){
        console.log(this);
        return ()=>{
            console.log(this);
        }
    },
    sayHi: function(){
        return function() {
            console.log(this);
            return ()=>{
                console.log(this);
            }
        }
    },
    say: ()=>{
        console.log(this);
    }
}
let hi = obj.hi();  //输出obj对象
hi();               //输出obj对象
let sayHi = obj.sayHi();
let fun1 = sayHi(); //输出window
fun1();             //输出window
obj.say();          //输出window

1.隐式绑定,this绑定在obj上,所以输出obj

2.箭头函数的this在定义的时候就确定了

当执行到这一步时,箭头函数就已经定义了,这个时候箭头函数外部的this还是obj;需要注意的是如果在这把箭头函数换成普通函数,函数中的this将指向window,因为在运行到这一步时,出现了隐式绑定丢失,hi中的this已经改变为window

3.在执行到这一步的时候就出现了上面讲的隐式绑定丢失,函数的执行上下文是window,同时在这一步,箭头函数开始定义(并没有执行),定义的时候外层环境的this已经指向window了

4.箭头函数定义的时候外层环境的this已经指向window了,所以输出window

5.箭头函数自身没有this,往上找就找到了全局的this(这一步困扰我好久,以前光知道箭头函数自身没有this,没有细想,搞明白这里才想明白原来this是函数提供的...) 

 

posted @ 2022-08-15 16:00  北火廿口  阅读(48)  评论(0)    收藏  举报