一般函数
一般函数的this,由动静作用域决定,指向它的间接调用者,没有间接调用者对立指向window
1、状况一
function outFun() { console.log(this);}outFun(); // this指向window// outFun()没有间接调用者// this指向window
2、状况二
var obj = { outFun: function() { console.log(this); }};obj.outFun(); // this指向objvar og = obj.outFun;og(); // this指向window// obj.outFun()的间接调用者是obj,所以this指向obj// 把obj.outFun赋值给og,og()等同于间接执行outFun,此时没有间接调用者
3、状况三
var obj = { outFun: function () { function inFun () { console.log(this) }; inFun (); }};obj.outFun(); // this指向window// inFun执行时没有间接调用者// 当没有间接调用者的时候// this指向window
箭头函数
箭头函数没有本人的this,箭头函数里的this就是内部作用域里this
1、状况一
var outFun = () => { console.log(this);};outFun(); // this指向window// 箭头函数的内部作用域就是全局作用域// 全局作用域里的this指向的就是window(严格模式下,指向的是undefined)
2、状况二
var obj = { outFun: () => { console.log(this); }};obj.outFun(); // this指向windowvar og = obj.outFun;og(); // this指向window// 箭头函数是对象obj里的一个属性// 其内部作用域也是全局作用域// this同样指向window
3、状况三
var obj = { outFun: function () { var inFun = () => { console.log(this); }; inFun(); }};obj.outFun(); // this指向的objvar og = obj.outFun;og(); // this指向window// 箭头函数inFun的内部作用域是outFun// 箭头函数里的this和内部作用域的this指向统一// 然而outFun是个一般函数,一般函数的this指向的是其间接调用者// 没有间接调用者时,指向window
4、状况四
var obj = { inObj: { outFun: () => { console.log(this) } }}obj.inObj.outFun() // this指向window// 箭头函数outFun是obj.inObj的一个属性// 内部作用域是全局作用域// 所以this指向window