一说到函数,我们就要想到this,那么今天我们就来搞懂函数的this指向
函数有两种,一个是普通函数,一个是箭头函数
1.首先我们先来说普通函数
常见的普通函数就是下面这两种(以下代码不是在严格模式下哦):
var fun1=function(){
console.log(this)
}
function fun2(){
console.log(this)
}
fun1()
fun2()
那么当这两个函数直接调用的时候,其中的this就是window,因为普通函数的this指向他的调用者,如果前面没有调用者,那么this的值会是全局对象。在浏览器环境中,全局对象是window。
那我们进阶一下
var obj={
fun(){
console.log(this)
}
}
var fun2=obj.fun
obj.fun()
fun2()
根据刚才说的普通函数的this指向他的调用者,那么obj.fun()中打印的this就是obj了
第二个fun2(),首先他是一个全局的变量,接收的值是obj.fun,那么直接调用的话,其中的this是什么呢,其实还是刚才说的,如果普通函数前面没有调用者,那么this的值会是全局对象。
总结一下,在非严格模式下,没有调用对象的普通函数调用者都是window,即使这个函数是定义在某一个对象上的。而有调用者的则this指向调用者
2.箭头函数
箭头函数是没有自己的this的,那他的this是从哪里来的呢
let fun=()=>{
console.log(this)
}
fun()
箭头函数自身是没有this,他的this是继承在创建时所处作用域中的this。那么这里fun创建时处于全局作用域中,全局中的this就是window,所以fun执行时打印的this就是window
进阶
let obj={
a(){
let fun=()=>{
console.log(this)
}
fun()
},
fun2 : ()=>{
console.log(this)
}
}
obj.a()
obj.fun2()
根据箭头函数this是继承在创建时所处作用域中的this,obj.a()执行的时候,a函数中的this就是obj,而fun是创建时是在a函数作用域中,这个时候a函数作用域中的this是obj,所以执行的fun中打印的this就是obj
obj.fun2(),这个fun2创建时所处的作用域就是全局,所以他的this就是window,所以obj.fun2()打印的this就是window