FE-DSHUI / DSHUI

前端王者小分队读书会
4 stars 1 forks source link

《你不知道的JavaScript(上卷)》-this全面解析(2)-2021-1-29分享 #30

Open AwakenedSomeone opened 3 years ago

AwakenedSomeone commented 3 years ago

接上一次this(1)

上次说到了this作用域的绑定规则之一:默认绑定到全局作用域,这次说一下第二个方式:隐式绑定。 隐式绑定要考虑调用位置是否有上下文对象,或者说是否被某个对象拥有或包含。举个栗子:

function foo () {
  console.log(this.a)
}
var obj = {
  a: 2,
  foo: foo
}
obj.foo()  // 2
     这里foo被调用的时候,是通过对象obj去调用的,调用位置会使用obj上下文来引用函数,此时可以称函数foo被调用时obj对象“拥有”或者“包含”foo函数的引用。

当函数引用有上下文对象的时候,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。因为调用foo时this被绑定到obj,此时this.a和obj.a是一样的。 需要注意的一点:对象属性引用链中只有上一层或者说最后一层在调用位置中起作用。如下所示:

function foo () {
  console.log(this.a)
}
var obj2 = {
  a: 42,
  foo: foo
}
var obj1 = {
  a: 2,
  obj2: obj2
}
obj1.obj2.foo() // 42
  由这个例子可以看出,this被绑定到了obj2上下文对象上,而没有再绑定到obj1上了。