JavaScript:“this”关键字[上下文]速查表
JavaScript 上下文,也就是“this”关键字本身就是一个相当令人困惑的话题。尽管它非常简单且语义清晰,但我却很容易忘记上下文相关的规则。闲话少叙,现在就让我来介绍一下臭名昭著的“this”关键字的速查表吧!
Quick side note: This article is intended as a cheatsheet around JS context, It does not serve as a verbose explanation of the concept. If you are beginner and have not explored the 'context' concept yet, I highly recommend you to read this MDN 文档 first
备忘单:
| 用例 | 这 | 例子 |
|---|---|---|
| 正常功能 | ||
| 直接调用 | 窗户 |
fn() // 这个 -> 窗口 |
| 从对象调用 [隐式绑定] |
调用对象 |
obj.fn() // 这 -> 对象 |
| 显式绑定 (绑定、调用、应用) |
已通过引用 |
// --- .调用 .应用 --- // obj.fn.call(otherObj) // 这 -> 其他对象 |
| 在 严格模式下调用 |
未定义 [[如果this->window]] |
“使用严格” fn() // 这 -> 未定义 window.globalFn = fn 窗口.globalFn() // 这 -> 未定义 obj.fn.call(窗口) // 这 -> 未定义 |
| 箭头函数 | ||
实例化上下文:使用构造函数创建对象实例时“this”[Context] 的值。 |
||
| 调用 [直接从对象或] |
实例化上下文 |
// ----- 直接调用 ---- //
// 实例化上下文:窗口
const fn = () => console.log(this)
fn()
// 这个 -> 窗口
// ----- 从 obj [类实例] 调用 ---- //
函数myClass(){
this.fn = () => console.log(this)
}
- 或者 -
类 myClass {
构造函数(){
this.fn = () => console.log(this)
}
}
// 实例化上下文:obj1
const obj1 = new myClass()
obj1.fn()
// 这 -> obj1
// ----- 从 obj 调用 ---- //
// 实例化上下文:窗口
const obj2 = { fn: () => console.log(this) }
obj2.fn()
// 这个 -> 窗口
|
| 显式绑定 (绑定、调用、应用) |
实例化上下文 [无效果] |
obj.fn.call(otherObj) // 这个 -> 窗口 实例.fn.调用(otherObj) // 这 -> 实例 |
在严格模式下调用 |
未定义 [[如果这个->窗口]] |
“使用严格” fn() // 这 -> 未定义 |
一些简单的例子🤥:
const fn = function(){
console.log(这个)
}
const obj = {
fn1:fn,
fn2:函数(){
fn()
},
fn3:函数(){
this.fn1()
},
fn4:fn.bind(obj),
fn5:函数(){
this.fn1.call(obj)
}
}
obj.fn1()
// 日志:obj
// 因为“fn1”是通过 obj 对象调用的
obj.fn2()
// 日志:窗口
// 因为“fn2”是通过 obj 调用的,但是
// 内部的“fn”被直接调用
obj.fn3()
// 日志:obj
// fn3 是通过 obj 调用的,“this”指向
// 'obj'。由于 'this' -> obj,内部执行
// [this.fn()] 一样好
// 作为 obj.fn1()
obj.fn4()
// 日志:obj
// 显式上下文绑定;)
obj.fn5()
// 日志:obj
// 希望你能掌握它 :P
一些更简单的例子🤥🤥🤥:
函数 fnConstructor(){
const fn = () => console.log(this)
this.fn1 = () => console.log(this),
this.fn2 = 函数(){
console.log(这个)
}
这个.fn3 = fn,
this.fn4 = 函数(){
fn()
}
this.innerObj = { fn }
}
const obj = new fnConstructor()
const obj2 = {
obFn1:obj.fn1,
obFn2: () => console.log(this)
}
obj.fn1()
// 日志:obj(实例化上下文!)
obj.fn2()
// 日志:obj(Duhh^^)
obj.fn3()
// 日志:窗口;)
obj.fn4()
// 日志:obj(实例化上下文!)
obj.innerObj.fn()
// 日志:obj(实例化上下文!!)
obj2.obFn1()
// 日志:obj(实例化上下文!)
obj2.obFn2()
// 日志:窗口;)

希望这对您有帮助😇
如果您有任何问题/困惑/建议/更正,请在下面的评论部分发表。
后端开发教程 - Java、Spring Boot 实战 - msg200.com