函数 this 对象
(以下是重新整理了 我的博客 —— 理解 this 指向。)
this 对象指向当前函数被调用时的执行上下文(execution context
(章节)),即可理解为是谁调用了当前函数。
在非箭头函数的函数中, this
对象只有在该函数被 调用时(即函数的执行上下文成为当前正在执行的执行上下文(running execution context
)),才能确定 this
的值。箭头函数本身是没有 this
对象的,它内部的 this
对象是借用的定义函数时外部环境的 this
对象。即只有箭头函数中的 this
对象是固定的,它在定义时确定。
const obj = {
fn: () => this
}
// 箭头函数中的 this 在定义时确认,它内部的 this 对象是借用的外部 this 对象
obj.fn() === window // true
1
2
3
4
5
6
2
3
4
5
6
以下所指函数均为非箭头函数。
以方法的形式调用
一般情况下,函数内部的 this
指向 最近的 调用该函数的对象。
const obj = {
fn () {
return this
}
}
obj.fn() === obj // true,fn 中的 this 指向 obj
const object = {
childObj: {
fn () {
return this
}
}
}
object.childObj.fn() === object.childObj // true,fn 中的 this 指向 childObj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
赋值后调用
将某对象的一个方法赋值给一个变量之后,再调用该变量执行函数时,函数内部的 this
指向全局对象或 undefined
(严格模式)
const obj = {
fn0 () {
return this
}
}
const fn = obj.fn0
fn() === window // true,fn0 中的 this 将指向全局对象或 undefined (严格模式)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
其他函数内部调用
在一个函数内部调用函数 A 时,A 中的 this
将指向全局对象或 undefined
(严格模式)
function foo () {
return this
}
function fn () {
return foo()
}
fn() === window // true
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
从逻辑上讲,this
是指向调用该函数的对象(通过显式或隐式调用),即 fn 函数(fn 隐式调用 foo 函数)。但实际情况是指向全局对象。JavaScript 语言精粹
(P27) 中作者认为这是 JavaScript
语言设计的一个缺陷。
构造函数实例化
当构造函数与 new 连用时,构造函数中的 this
将指向实例
function Fn (name) {
this.name = name
}
const fn = new Fn('JS') // { name: 'JS' }
1
2
3
4
5
2
3
4
5