确定一个this
具体引用的是谁
-
首先查看是否使用
new
操作符调用,使用new
操作符后,this
绑定到这个新创建的对象实例上 。const bar = new fn()
-
是否使用
call
,apply
,bind
,使用了这三个方法后,会将this
显示绑定(硬绑定)到传入的第一个参数const bar = fn.call(obj)
-
是否通过一个对象上下文来引用函数,如果是,则会将
this
隐式绑定到这个对象const bar = obj.fn()
-
如果都不是,则使用默认绑定,绑定到
window
对象(严格模式this
指向undefined
)const bar = fn()
标准函数中的this
在标准函数中,
this
引用的是把函数当成方法调用的上下文对象 (如果觉得默认绑定和隐式绑定无法确定时,可以使用此方法,再判断一次)箭头函数中的this
在箭头函数中,由于箭头函数是没有
this
的,所以this
引用的是定义箭头函数所在的上下文对象 ,会根据词法作用域进行查找。
对于函数被当作参数传递时,请记住函数也是对象,函数名其实相当于保存一个函数引用的变量,传递的只是这个函数的引用
function fn() {
console.log(this.a)
}
const o = {
a: 'object o',
foo: fn
}
let a = 'window';
function bar(fn) {
fn()
}
bar(o.foo) //undefined