普通函数的this指向

318 阅读1分钟

以下知识点其实可以总结为一句话: 谁调用函数,函数的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 > 显示绑定 > 隐式绑定 > 默认绑定