1.在函数中直接使用的this指向window
var age = 18; var person = { age: 22, say: function(){ console.log(this.age) } } fn = person.say; fn(); //18
*这里的 fn() 是直接调用,所以等同于 fn.call(window)
2. 在对象中调用,谁调用this就指向谁
var age = 18; var person = { age: 22, say: function(){ console.log(this.age) } } fn = person.say; fn(); //18 person.say(); //22
*person.say()是person调用的this,所以指向person对象本身,等同于person.say.call(person)
结合以上两点拓展:
var age = 18; var person = { age: 22, say: function(){ console.log(this.age) } } fn = person.say; fn(); //18 person.say(); //22 var person2 = { age: 33, say: function(fn){ fn() //函数直接调用 = fn.call(window) } } person2.say(person.say) //18 person2.say = person.say person2.say() //33 person2.say.call(person2)
3.箭头函数中的this指向
箭头函数中的this是继承父级的上下文的this
例1:
var age = 18; var person3 = { age: 22, say: () => { console.log(this.age) } } person3.say(); //18
*这里的箭头函数say和person3平级,person3的父级上下文即window,所以这里的this指向的是window
例2:
var age = 18; var person4 = { age: 22, say: function(){ var a = () => { console.log(this.age) } return a(); } } person4.say(); //22
*这里的箭头函数a是函数say的子级,即this指向的是函数say的上下文person4