Javascript 中的 this 指向

一、函数调用

非箭头函数内,this 指向函数运行时调用它的对象。

箭头函数内,this 指向定义时所在的对象。

(1)全局性调用的函数内 —— this 指向全局性对象 window

// code 例子
var x = 1
function test(){
  alert(this.x)
}
test() // 1

(2)作为对象方法调用的函数内 —— this 指向上级对象

// code 例子
function test(){
 alert(this.x)
}
var o = {}
o.x = 1
o.m = test
o.m() // 1

(3)箭头函数内 —— this 指向定义时所在的对象

function foo() {
  id = 42
  setTimeout(() => {
    console.log(this.id)
  }, 100)
}
var id = 21
foo() // 42

二、构造函数内 —— this 指向实例对象

var x = 2
function test() {
  this.x = 1
}
var o = new test()
console.log(o.x) // 1

(1)ES6 的 class

ES6 的类即构造函数的封装,完全可以看作构造函数的另一种写法。因此,类的方法内部如果含有this,它默认指向类的实例。

三、函数方法调用函数

apply() & call()

先把apply()MDN 文档定义搬运过来:

apply() 方法调用一个函数, 使其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。

因此,apply()调用的函数的 this 指向 apply()方法的第一个参数,apply()的参数为空时,默认调用全局对象。因此,这时的 this 指的是全局对象。

var x = 0
function test(){
 alert(this.x)
}
var o={}
o.x = 1
o.m = test  
o.m.apply() //0
o.m.apply(o) //1

bind()

直接bind()MDN 文档定义搬运过来:

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在新函数参数列表前加上提供的给定的参数序列。
Table of Contents