函数内的非严格模式通常定义函数的this是window,例如:functiondoit(){console.log(this);}doit();printresult:Window{window:Window,self:Window,document:document,name:'',location:Location,…}严格模式但是,如果启用严格模式:"usestrict"functiondoit(){console.log(这个);}doit();printresult:undefinedarrowfunction但是如果把严格模式改成箭头函数,打印结果还是window:"usestrict"vardoit=()=>{console.log(this);}doit();对象中的普通功能可以概括为:谁叫我,我指向谁。比如我们现在有一个json如下:varobj={key1:{key2:{doit:function(){console.log(this);},key3:{doit:function(){console.log(this);}}}}};然后,执行如下语句:obj.key1.key2.doit();打印出来的结果是:{key3:{…},doit:?}因为我调用的是obj.key1.key2,所以是这样的。并执行如下语句:obj.key1.key2.key3.doit();打印出来的结果是:{doit:?}同理,此时是obj.key1.key2.key3。如果收到,先保存,然后这样调用:vardoit=obj.key1.key2.doit;doit();打印结果如下:Window{window:Window,self:Window,document:document,name:'',location:Location,…}箭头函数这里的情况其实更简单,this一直指向当前作用域内的this.比如我们修改上面的json:varobj={key1:{key2:{doit:()=>{console.log(this);},key3:{doit:()=>{console.log(this);}}}}}那么对于下面的语句:obj.key1.key2.doit();obj.key1.key2.key3.doit();那么打印结果为:Window{window:Window,self:Window,document:document,name:'',location:Location,…}Window{window:Window,self:Window,document:document,name:'',location:Location,…}由于json是在全局范围内定义的,所以这个是窗口。例如,我们有以下json:varjson={doit:function(){returnfunction(){console.log(this);};}};打印结果:Window{window:Window,self:Window,document:document,name:'',location:Location,...}
