js的this

36 阅读2分钟

如何开启严格模式 image.png

如何确认this的值

全局代码中的this

  • 在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。
  • 在全局执行环境中,指向全局对象(无论全局中的代码处于非严格模式还是严格模式下)
//Window
console.log(this

函数内部,取决于函数被调用的方式

  1. 直接调用的this值:
  • 非严格模式:全局对象(window)
  • 严格模式:undefined
  1. 对象方法调用的this值:
  • 调用者(不论是否是严格还是非严格模式)

如何指定this的值

可以通过2类方法指定this:

  1. 调用时指定:
  • call方法:挨个传入参数
  • apply方法:以数组方式传入参数
  1. 创建时指定:
  • bind方法:
  • 箭头函数:
function func(numA,numB){
    console.log(this)
    console.log(numA,numB)
}
const person={
    name:'travis'
}
///调用时指定this
//1.1  call:挨个传入参数
func.call(person,1,2)//打印的是{name:'travis'}  1 2
//1.2  apply:以数组的方式传入参数
func.apply(person,[3,4])//打印的是{name:'travis'}  3 4

//创建时指定this
//2.1  bind方法:也是挨个传入参数和call类似,bind返回的是新函数
const bindFunc=func.bind(person,666)//这里已经传入了第一个参数666,也就是形参numA
bindFunc(888)//调用时传入了第二个参数888,也就是形参numB,将会打印出{name:'travis'} 666 888

//2.2箭头函数
const food={
    name:'西兰花炒鸡蛋'eat(){
        console.log(this)
        setTimeout(function(){
            console.log(this)
        },1000)
    }
}
food.eat()//第一个this指向food这个对象,第二个this指向window,
//超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象**,**在严格模式下是undefined**
const food={
    name:'西兰花炒鸡蛋'eat(){
        console.log(this)
        setTimeout(()=>{
             console.log(this)
        },1000)
    }
}
food.eat()//两个this都指向food这个对象,箭头函数里没有this,因此会往上层作用域中去找,上层作用域的this就是food这个对象。