前言
很多JS初学者第一次接触this的时候,很容易被他的指向搞晕。我当时也不例外,现在回过头来记录一下this指向的有关案例。
ES5
在es5中,我们可以简单的理解this的指向规律为:谁执行或者是谁的就指向谁。
在全局作用域中
function fn() {
console.log(this)
}
fn()
在对象上
let obj = {
showThis(){
console.log(this)
}
}
obj.showThis()
好,很自信是不是,给你来个坑
let obj = {
showThis(){
setTimeOut(function(){console.log(this)},0)
}
}
obj.showThis()
那想打印正确的this指向怎么办呢?可以借助es6的箭头函数。
ES6箭头函数
es6的箭头函数this指向当前环境,且是固定的。
引用我之前写箭头函数的文章的话就是:
具体就是指向箭头函数所在代码位置的环境。在箭头函数外面打console.log(this)就知道指向谁了,而且是定死的无法被二次修改,解决了es5中this指向混乱的问题,防止开发过程代码量大起来,因为this的指向问题出现错误。
let obj = {
showThis(){
setTimeOut(()=>{console.log(this)},0)
}
}
obj.showThis()
其实对环境这个词觉得抽象的话,可以理解为指向上个作用域即可。
class类中
class Person {
constructor(name) {
this.name = name
}
showThis(){
console.log(this)
}
}
const man = new Person('小夏')
man.showThis()
改变this指向
主要是三剑客:call、apply、bind
function fn() {
console.log(this)
}
fn.call({a: 1})
可以看到call就是改变指向的同时执行函数。call的第二个参数是fn的入参,例如fn.call(null, 1, 2)
const fn1 = fn.bind({a: 1})
fn1()
可以看出,bind改变this指向,并返回改变指向后的函数,还需要自己亲自执行。bind的第二个参数是fn的入参,例如bind.call(null, 1, 2)()
apply的用法和call一样,只不过第二个参数传的是数组,例如:fn.apply(null, [1, 2])
|