this

概念

当一个函数被调用时,会创建一个活动记录(有时也称为执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this就是这个记录的一个属性,会在函数执行的过程中用到

this的四条调用规则:
  • 默认绑定:在严格模式下绑定到undefined,否则绑定到全局对象
var a = 1
function foo() {
  console.log(this.a)
}
foo()  // 1

上例中,函数调用时应用了this的默认绑定,因此this指向全局变量。

  • 隐式绑定:由上下文对象调用?绑定到那个上下文对象。
var a = 3
function foo() {
  console.log(this.a)
}
var obj = {
  a: 2,
  fn: foo
}
obj.fn()  // 2

上例中,函数foo在被调用时,调用位置会用obj的上下文来引用函数,当函数拥有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象,因此,this指向obj。

  • 显式绑定:由call或者apply(或者bind)调用?绑定到指定的对象。
var a = 2
function foo() {
  console.log(this.a)
}
var obj = {
  a: 3
}

foo.call(obj)  \\ 3

上例中,通过foo.call(...),我们在调用foo时强制把它的this绑定到obj上。

  • new调用:由new调用?绑定到新创建的对象。
function Foo() {
  console.log(this)
}
var fn = new Foo()  // Object{constructor: Foo}

上例中,使用new来调用Foo(...)时,我们会构造一个新对象并把它绑定到Foo(...)调用中的this上

this四条规则的优先级:

new调用 > 显式调用 > 隐式调用 > 默认绑定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容