你会感到混乱是因为你把两个函数声明同时写出来,又同时调用了一些容易混淆的概念。
从头开始分析:
var a = 11;
这句话相当于 window.a = 11;
函数中的this是根据上下文改变的。
当函数作为构造函数时,this 指的就是实例对象。
当函数作为普通函数时,也要根据调用的上下文来判断,如果没有指定上下文引用,在浏览器中就指向window对象,在node中会指向global对象。
你在test函数中又声明了一个函数b,并且在test函数内部直接调用了函数b。
函数b并没有绑定上下文,他依然指向window。
所以第一个函数的结论是:
new test1()的时候,this.a指向的是实例对象,内部函数b指向的是window.a。所以是11;
test1()的时候,this.a由于没有指定上下文,指向了window.a。也就相当于将window.a改为22了。所以函数b打印出来的window.a是22。
至于箭头函数,他会找到声明该函数作用域的顶层作用域,同时上下文也会指向他。
说的稍微有点绕,慢慢理解。
从头开始分析:
var a = 11;
这句话相当于 window.a = 11;
函数中的this是根据上下文改变的。
当函数作为构造函数时,this 指的就是实例对象。
当函数作为普通函数时,也要根据调用的上下文来判断,如果没有指定上下文引用,在浏览器中就指向window对象,在node中会指向global对象。
你在test函数中又声明了一个函数b,并且在test函数内部直接调用了函数b。
函数b并没有绑定上下文,他依然指向window。
所以第一个函数的结论是:
new test1()的时候,this.a指向的是实例对象,内部函数b指向的是window.a。所以是11;
test1()的时候,this.a由于没有指定上下文,指向了window.a。也就相当于将window.a改为22了。所以函数b打印出来的window.a是22。
至于箭头函数,他会找到声明该函数作用域的顶层作用域,同时上下文也会指向他。
说的稍微有点绕,慢慢理解。
