记住几点就好:

  1. 函数的this指向是在函数被调用的时候确定的(依据其作用域决定)
  2. 如果函数是被某个对象调用(例如: obj.fn()), 那么其this指向改对象;如果函数是独立执行的,那么其内部的this指向undefined
  3. 非严格模式下,this指向undefined以后,会自动指向全局对象
  4. call和apply可以手动设置this的指向
  5. 箭头函数比较特别,他本身没有this的概念,其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
// demo1
var data = 5;
function fn() {
console.log(this.data);
}
fn(); // 5
// demo2
var data = 5;
function fn() {
function foo() {
console.log(this.data)
}
foo();
}
fn(); // 5
// demo3
var data = 5;
function fn() {
'use strict'
function foo() {
console.log(this.data)
}
foo();
}
fn(); // undefined
// demo4
var data = 5;
var obj = {
data: 10,
val: this.data,
fn: function () {
return this.data;
}
}
console.log(obj.val); // 5 因为obj并不是函数, 所以this指向undefined
console.log(obj.fn); // 10

前端基础进阶(五):全方位解读this