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() // 日志:窗口;)
希望这对您有帮助😇
如果您有任何问题/困惑/建议/更正,请在下面的评论部分发表。