this的作用域一直搞不懂,不多说上代码        var a = 1;
        var b = {
            a:2,
            test:function(){
                var a = 3;
                console.log(this)
                return function(){    
                    console.log(this);
                }
            }
        }
        b.test()(); // 2  1
这个我的理解是b.test()返回了匿名函数 ,再执行该函数有点像var c = b.test();c();所以返回的匿名函数中this是指向全局变量window的。
but,再看这代码,把function改成箭头函数        var a = 1;
        var b = {
            a:2,
            test:function(){
                var a = 3;
                console.log(this.a)
                return ()=>{    
                    console.log(this.a);
                }
            }
        }
        b.test()(); // 2  2
这个我就不太懂了,我知道箭头函数中的this是指向该作用域中的上一层作用域。
但是如果按照上一个理解,该匿名函数已经被返回,当前的作用域指的是window,所以返回的箭头函数指向的不是window的上一层?但是此时的this确实指向b中的作用域。这个确实一头雾水???
ps:实测如果直接调用全局箭头函数,this还是指向window,这是window的上一层没有window?还是null? 还是如果箭头函数是全局变量this就是返回window?(这个有大佬知道可以请教下小弟)

解决方案 »

  1.   

    在全局作用域下指向Windows,我方法函数内谁调用就指向谁,在箭头函数中则是继承父执行上下文里面的this。个人见解。
      

  2.   

    函数的上一层作用域永远是函数定义时所处的作用域,不是函数调用时所处的作用域。
    你这个箭头函数是在test函数中定义的,那么这个箭头函数的上一层作用域就永远是test函数执行时所产生的作用域。不论箭头函数在什么地方调用都不会改变。这也就是闭包效应。