·
Across the Great Wall, we can reach every corner in the world.

默认绑定

函数调用时无任何调用前缀的情景,指向全局,在严格模式环境中,默认绑定的this指向undefined,如:

function fn() {
    console.log(this); //window
    console.log(this.str);
};

function fn1() {
    "use strict";
    console.log(this); //undefined
    console.log(this.str);
};

隐式绑定

如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上,比如

function fn() {
    console.log(this.str);
};
let obj = {
    str: 'hackertalk',
    func: fn
};
obj.func() // hackertalk

如果函数调用前存在多个对象,this指向距离调用自己最近的对象。

显式绑定

通过call、apply以及bind方法改变this的行为,指向参数提供的是null或者undefined,那么 this 将指向全局对象

let str = 'hackertalk';
fn.call(undefined); // hackertalk
fn.apply(null); // hackertalk
fn.bind(undefined)(); // hackertalk

new 绑定

通过 new 关键字构造的新对象,this 指向新对象本身

function Fn(){
    this.str = 'hackertalk';
};
let obj = new Fn();
obj.str // hackertalk

绑定优先级

显式绑定 > 隐式绑定 > 默认绑定

new绑定 > 隐式绑定 > 默认绑定

因为 new 和显示绑定不会同时发送,所有没有这两者的比较,比如:

let obj2 = new Fn().call(obj1);

这样写会报错: call is not a function

参考:MDN: javasctipt this