以下知识点其实可以总结为一句话: 谁调用函数,函数的this就指向谁
友善提醒: 严格模式下的其中一条规则是:禁止this指向全局对象,也就是再也没有window了,比如node环境就是严格模式
1、默认绑定: 非严格模式下,this默认绑定到window
function func(){
console.log(this) //window,严格模式下为undefined
}
func() // 相当于window.func
2、隐式绑定: this绑定到调用者
function func(){
console.log(this.a)
}
let obj = {
a:1,
func:func
}
var a = 100 // let、const声明的变量不在window里面,这里用var是为了验证隐式绑定丢失情况
// -------------华丽的分割线-------------------
// 1、正常情况
obj.func() // a的结果为1
// 2、隐式绑定丢失情况
let b = obj.func
b() //a的值为100,因为这种情况相当于window在调用func,不关obj的事
3、new绑定: this绑定到实例化对象
function func(name){
this.name = name //帮实例化对象添加一个name的属性
}
let b = new func('刘德华') //在new的时候,this就指向了实例化对象b
console.log(b.name)
4、显示绑定: 通过call()、apply()、bind()方法将this绑定到传入的参数
function func(){
console.log(this.a)
}
let obj = {
a:1,
func:func
}
var a = 100
let b = obj.func
b() ///a的值为100,因为这种情况相当于window在调用func,不关obj的事
//---------------我们来重新指定this的指向----------------
b.call(obj) //三个方法都是重新指定this指向,不一样的地方等下次跟源码配合解释比较好
b.apply(obj)
let c = b.bind(obj)
c()
绑定优先级:new > 显示绑定 > 隐式绑定 > 默认绑定