如何开启严格模式
如何确认this的值
全局代码中的this
- 在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。
- 在全局执行环境中,指向全局对象(无论全局中的代码处于非严格模式还是严格模式下)
//Window
console.log(this
函数内部,取决于函数被调用的方式
- 直接调用的this值:
- 非严格模式:全局对象(window)
- 严格模式:undefined
- 对象方法调用的this值:
- 调用者(不论是否是严格还是非严格模式)
如何指定this的值
可以通过2类方法指定this:
- 调用时指定:
- call方法:挨个传入参数
- apply方法:以数组方式传入参数
- 创建时指定:
- 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这个对象。