四个常规、一个特殊
四个常规:
1.new绑定
function foo(a) {
this.a = a
}
var bar = new foo(2)
console.log(bar.a) //2
使用new调用的函数,则其中this将会被绑定到那个新构造的对象。
2.显式绑定
let web = { webName: "蚂蚁部落" };
function fn() {
console.log(this);
}
fn(); //window
fn.call(web); //{ webName: "蚂蚁部落" }
强行改变this指向,函数this指向bind、apply或call方法调用时的第一个参数。这三种传参方式不同。
3.隐式绑定
var o = {
a: 10,
b: {
a: 12,
fn: function () {
console.log(this);
}
}
}
o.b.fn();
c = o.b.fn;//12
c();//window
函数作为对象中的一个属性,成为该对象的一个方法,this指向该对象(最常见的最后谁调用指向谁)
4.默认绑定
function a(){
var author = "lry";
console.log(this.author); //undefined
console.log(this); //Window
}
a(); //其实这是相当于 window.a()
严格模式下指向undefined,正常模式下指向window
一个特殊:
箭头函数
let obj = {
foo: () => {
console.log(this) //window
}
}
obj.foo()
this在箭头函数创建时确定,它与声明所在的上下文相同。