先把绑定的优先级抛出结论,按照以下顺序进行判断:
- 函数是否在 new 中调用(new 绑定)?如果是的话,this 绑定的是新创建的对象。
var bar = new Foo()
- 函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话, this 绑定的是指定的对象。
var bar = foo.call(obj2)
- 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。
var bar = obj1.foo()
- 如果都不是,使用默认绑定,严格模式下,绑定到 undefined,否则绑定到全局对象。
var bar = foo()
箭头函数默认不会使用自己的this,而是继承父执行上下文里面的this
this.a = 11;
console.log(this) // 符合条件4,所以此时的 this 是全局对象 window
console.log(window.a) // 11
function test2() {
console.log(this) // 函数调用符合条件四,所以此时的 this 是全局对象 window
this.a = 22 // 此时的 this 是全局对象 window,修改了window 下的 a
console.log(this.a)// 22,此时的 this 是全局对象
let b = () => {
//22, 箭头函数继承父作用域的this,也就是函数作用域 test2 此时的this -- window
console.log(this.a)
}
b();
}
console.log(this.a) //输出11, 此时的 this 是全局对象 window
test2()
console.log(this.a) //输出22, 此时的 this 是全局对象 window,
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…