• 普通函数的this指向在运行时确定
  • 箭头函数的this指向在定义之后就已经确定

一、test()

普通模式下this指向全局,严格模式下this为undefined

1
2
3
4
5
6
var a = 1
function test() {
console.log(this)
console.log(this.a)
}
test()

二、xx.test()

this绑定到函数调用者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var a = 1
function test() {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
obj.test()

var a = 1
function test() {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
var obj1 = {
a: 3,
obj,
}
obj1.obj.test()

var a = 1
function test() {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
var testCopy = obj.test
testCopy()

var a = 1
function test() {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
setTimeout(obj.test)

三、test.call(xxx) / test.apply(xxx) / test.bind()

this指向arg

1
2
3
4
5
6
7
8
9
10
11
var a = 1
function test() {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
var testCopy = obj.test
// testCopy.call(obj)
testCopy.apply(obj)

四、new test()

构造函数里的this指的就是将要被new出来的新对象

1
2
3
4
5
6
var a = 1
function test(a) {
this.a = a
}
var b = new test(2)
console.log(b.a)

五、箭头函数 () => {}

this指向的是它的外层作用域this的指向

1
2
3
4
5
6
7
8
9
var a = 1
var test = () => {
console.log(this.a)
}
var obj = {
a: 2,
test,
}
obj.test()