你知道this的常见指向有哪些吗?

70 阅读2分钟

「这是我参与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上下文。