常见的几种情况:
1.全局环境下,this指向window
console.log(this);//全局环境,this指向window
2.定时器、立即执行函数中的this都指向window
setTimeout(function(){
console.log(this)//window
},1000);
(function(){
console.log(this);//window
})()
3.函数自执行
严格模式:undefined
非严格模式:window
function fn(){
console.log(this);
}
fn()//window
4.事件处理函数:触发事件的元素
谁触发了这个函数执行,this就指向谁
document.body.click=function(){
console.log(this);//body
}
5.obj对象方法
obj.fn()
this指向obj
var name="456"
var obj={
name:'123',
getName:function(){
console.log(this.name);
}
}
obj.getName();//obj调用函数执行,this指向obj
var get=obj.getName;
get();//函数自执行,指向window
6.call/apply/bind更改this指向
fn.call(新的this指向)
get.call(obj)//obj
get.apply(obj)//obj
7.构造函数中的this:指向new出来的实例
function Student(){
this.name="小明"
}
var stu1=new Student()
console.log(stu1.name);//小明
8.箭头函数
箭头函数中的this指向定义时的上下文的this,也就是说指向外层作用域this的值,从定义到销毁,函数中的this不发生改变
var title="window"
var obj1={
title:"obj",
fn:()=>{
console.log(this.title);
}
//箭头函数定义在对象中,fn的上下文指向的是obj对象,obj是定义在window中的
//所以无论fn怎么被调用,其中的this指向的都是window
}
obj1.fn();//window
let getTitle=obj1.fn;
getTitle()//window
普通函数中的this不在定义的时候确定,而在调用的时候确定,如果函数直接执行,则函数默认走预编译,函数中的this指向window,如果是匿名函数,this从定义的时候就确定了,之后不会发生改变