this的指向

this的理解

this是一个在运行时才进行绑定的引用,在不同的情况下它可能会被绑定不同的对象。

默认绑定:(指向window的情况)(普通函数调用模式fn())

默认情况下,this会被绑定到全局对象上,比如在浏览器环境下为window对象,在node.js环境下为global对象

message = "Hello"; 

function test () { 
  console.log(this.message); 
}

test() // "Hello"

隐式绑定:(谁调用,this指向谁)(方法调用模式 obj.fn())

如果函数的调用是从对象上发起时,则该函数中的this会被自动隐式绑定为对象

function test() {
    console.log(this.message); 
}

let obj = {
  message: "hello,world",
  test: test
}

obj.test() // "hello,world"

显示绑定:(又叫硬绑定)(上下文调用模式,想让this指向谁,this就指向谁)

硬绑定:call  apply  bind

function test() {
    console.log(this.message); 
}

let obj1 = {
  message: "你好世界123"
}

let obj2 = {
  message: "你好世界456"
}

test.bind(obj1)() // "你好世界123"
test.bind(obj2)() // "你好世界456"

new 绑定(构造函数模式)

在使用new创建对象时会进行this的绑定

当使用new调用构造函数时,会创建一个新的对象并将该对象绑定到构造函数中的this上

function Greeting(message) {
    this.message = message;
}

var obj = new Greeting("hello,world")
obj.message // "hello,world"

箭头函数中的this指向

箭头函数不同于传统函数,它没有属于自己的this

它所谓的this是,捕获其外层上下文中的this值作为自己的this值

并且箭头函数没有属于自己的this,它是不能被new调用

我们可以通过Babel转换前后的代码来清晰的理解箭头函数

// 转换前的 ES6 代码
const obj = { 
  test() { 
    return () => { 
      console.log(this === obj)
    }
  } 
}
// 转换后的 ES5 代码
var obj = { 
  test: function getArrow() { 
    var that = this
    return function () { 
      console.log(that === obj)
    }
  } 
}

这里我们看到,箭头函数中的this就是它上层上下文函数中的this

 

posted @ 2021-03-31 16:13  ShuaiBiZou  阅读(56)  评论(0)    收藏  举报