一般来说,this最终指向的是那个调用它的对象
目录
一.全局作用域下的this三种指向情况
1.在全局作用域中
console.log(this)
控制台打印出了一个window对象,那么说明在全局作用域下this指向的是全局顶级对象window
2.在普通函数中
function test(){
console.log(this)
}
test()
//或者window.test()
同样打印出来的是一个window全局顶级对象
3.在定时器中
//为了实验准确性-我们不使用箭头函数
const test = setInterval(function(){
console.log(this)
},2000)
const test2 = setTimeout(function(){
console.log(this)
},2000)
所以我们得出结论:全局作用域下的this或者普通函数中的this指向的都是全局对象
二.方法中的this三种指向情况
1.在自定义对象中
const getTest = {
name:"小蜗",
test:function(){
console.log(this)
}
}
getTest.test()
可以看到在自定义的对象中this指向的是调用它的对象
2.在传统注册事件中
const btn = document.querySelector('button')
btn.onclick = function(){
console.log(this)
}
我们得到的是调用这个点击事件的按钮对象
3.在addEventListener注册事件中
const btn = document.querySelector('button')
btn.addEventListener('click',function(){
console.log(this)
})
得到的也是调用这个事件的按钮
所以我们得出结论:方法中的this指向的都是调用者
三.构造函数中this的指向情况
function Test(){
console.log(this)
}
const test = new Test()
这时this指向了构造函数创建的test对象实例
四.箭头函数中this的指向情况
const btn = document.querySelector('button')
btn.addEventListener('click',()=> {
console.log(this)
})
之前我们所说的事件中this不应该指向调用者吗?为什么会指向全局顶级对象呢?
这是因为箭头函数没有function函数关键字,不可以形成一个作用域链,没有作用域链的话,this是查找不到调用它的对象的,所以只能找到顶级对象window(在本例子中)
那么如果将这个箭头函数放到一个构造函数中呢?
<body>
<button type="submit">点我点我</button>
</body>
<script>
const btn = document.querySelector('button')
function getTest(){
btn.addEventListener('click',()=> {
console.log(this)
})
}
const test = new getTest()
</script>
这时我们发现this指向了构造函数的实例化对象
所以我们得出结论:箭头函数中的this指向最近作用域链的对象
详细介绍箭头函数以及this指向问题: