记住两个口诀:
普通函数的this是:谁调用这个函数,函数的this就指向谁
箭头函数的this是:箭头函数定义时的执行上下文的this是谁,箭头函数的this就指向谁
实例代码:
var name=222
var b = {
name:111,
fn:()=>{
console.log(this.name)
},
fn2:function(){
console.log(this.name)
}
}
b.fn()//输出---------222
b.fn2()//输出--------111
//1. b.fn是一个箭头函数,根据口诀:箭头函数的this取决于其定义时的执行上下文,可以看到b.fn的执行上下文是对象b
//b的this为window,因此,b.fn()输出的this.name其实就是window.name
//2.b.fn2是一个普通函数,根据口诀:“谁调用这个函数,函数的this就指向谁”,因此fn2中的this就是b
再来看一段代码:
var birth = 2000
var obj ={
birth:2001,
getAge:function(){
var b = this.birth
console.log(b)
var birth = 2002
var fn = ()=>{console.log(this.birth)}
fn()
}
}
obj.getAge()//输出-----------2001
let fnGetAge = obj.getAge
fnGetAge()//输出-------------2000
分析:
obj.getAge()是一个普通函数,根据口诀:“谁调用这个函数,函数的this就指向谁”因此此时的getAge()this指向obj,再分析其中的箭头函数的this,根据口诀:“箭头函数定义时的执行上下文的this是谁,箭头函数的this就指向谁”这里的执行上下文就是函数getAge的函数作用域,因此函数getAge()的this指向谁,其内部的箭头函数也指向谁-----所以obj.getAge()执行输出2001
obj.getAge作为值赋值给fnGetAge,此时的fnGetAge的this指向window,因此其内部的箭头函数this也指向window—所以输出2000