「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
this指向谁呢 ?可能很多人回答是谁调用指向谁,这句话也没有错,但是区分好了常用的类型,使用起来更加清晰明了。
第一种:全局函数 :this指向window。
function myThis(){
console.log(this) //Window
}
myThis()
第二种:自执行函数 :this指向window。
(function myThis(){
console.log(this) //Window
})()
第三种:普通对象下定义的函数,当通过对象调用时指向该对象。
let my_obj = {
name:'bar',
doSome:function(){
console.log(this) //my_obj
}
}
my_obj.doSome()
第四种:把第三种赋值给一个变量去调用时,this指向执行的上下文环境
let my_obj = {
name:'bar',
doSome:function(){
console.log(this) //Window
}
}
let get_obj = my_obj.doSome
get_obj()
//window.get_obj()
上面的结果为什么是这样呢?其实get_obj前面window;this的指向是指向最接近调用它的对象 再来个例子:
let my_obj = {
age:'bar',
b:{
age:'foo',
c:{
name:'coo',
doSome(){
console.log(this.age)
}
}
}
}
my_obj.b.c.doSome() //coo
对比下面的例子,把c里面 name去掉,得到的结果是underfined.
let my_obj = {
age:'bar',
b:{
age:'foo',
c:{
// age:'coo',
doSome(){
console.log(this.age)
}
}
}
}
my_obj.b.c.doSome() // undefined
可以看出 doSome的this指向最接近调用它的c,当c里面的没有age变量,即使上一层对象有,也只在最靠近它的对象下找变量。
第五种:通过构造函数的new指向实例
function Person(obj){
this.age = obj.age;
console.log(this)//实例xiaoming
}
let xiaoming = new Person({age:'18'})
第六种: 严格模式下this默认指向undefined
function myThis(){
'use strict'
console.log(this) //undefined
}
myThis()
第七种:dom事件中的this指向触发事件的dom本身
<body>
<div>点我</div>
</body>
document.querySelector('div').onclick=function(){
console.log(this) //<div>点我</div>
}
第八种:定时器setTimeout和setInterval回调函数的this指向window
setTimeout(function(){
console.log(this) //window
},0)
第九种:回调函数不绑定this,this 指向定义时上下文的this(注意:回调函数不是没有this哦)
let obj = {
age:'18',
do:()=>{
console.log(this) //window
}
}
obj.do()
- 注:js 运行上下文有三种:1全局;2局部函数上下文;3eval上下文。