共计 2137 个字符,预计需要花费 6 分钟才能阅读完成。
温故而知新:重新认识 JavaScript 的 this
this
是 JavaScript
中的一个关键字,对于解说 this
的文章,网上资源很多。这里记录对于 this
的思考:什么是this
、为什么有this
。
什么是this
?
this
是形容函数执行的记录中的一个属性,只能在函数外部被拜访到,会在函数执行过程中被用到。
看标准中定义的形象操作Call(F, V [, argumentsList])
:
The abstract operation Call is used to call the
[[Call]]
internal method of a function object. The operation is called with arguments F, V, and optionally argumentsList where F is the function object, V is an ECMAScript language value that is the this value of the[[Call]]
, and argumentsList is the value passed to the corresponding argument of the internal method. If argumentsList is not present, a new empty List is used as its value.
执行 Call
操作的时候曾经传进去了 this
值,那再看下相干表达式 Function Calls 的阐明:
...
4.Let ref be the result of evaluating memberExpr.
...
9.Return ? EvaluateCall(func, ref, arguments, tailCall).
转到 EvaluateCall:
1.If Type(ref) is Reference, then
a. If IsPropertyReference(ref) is true, then
i. Let thisValue be GetThisValue(ref).
b. Else the base of ref is an Environment Record,
i. Let refEnv be GetBase(ref).
ii. Let thisValue be refEnv.WithBaseObject().
2.Else Type(ref) is not Reference,
a. Let thisValue be undefined.
看这是在形容 this
的值如何确定,而 EvaluateCall
的入参是没有 this
。这么来看的话,能够了解,this
是函数执行时,外部过程中的某个属性。即结尾的论断:this
是形容函数执行的记录中的一个属性,只能在函数外部被拜访到
为什么有this
?
为什么会有,能够思考 this
的应用,解决了什么问题?
You Don’t Know JS: this & Object Prototypes 中这么解释的:
this
提供了一种更优雅的形式来隐式“传递”一个对象援用,因而能够将API
设计得更加简洁并且易于复用。function identify() {return this.name.toUpperCase(); } function speak() {var greeting = "Hello, I'm " + identify.call(this); } var me = {name: "Kyle"}; var you = {name: "Reader"}; identify.call(me); // KYLE identify.call(you); // READER speak.call(me); // Hello, I'm KYLE speak.call(you); // Hello, I'm READER
(⊙o⊙)…尝试从这个单词自身思考下,this
应该是作为一个代词,那就应该是起代替或批示作用,this
用于近指。那指代的是什么呢?那就又得回到 ECMAScript
标准:
The base value component is either undefined, an Object, a Boolean, a String, a Symbol, a Number, or an Environment Record. A base value component of undefined indicates that the Reference could not be resolved to a binding. The referenced name component is a String or Symbol value.
这么来看,this
指代的事物的值可能性还蛮多的。思考下,如果 undefined
, an Object
, a Boolean
, a String
, a Symbol
, a Number
这些值,大可应用个标识符示意即可,没必要用到this
。
所以,大胆猜想,this
是不是指代environment record
,而且还是就近的environment record
???
参考资料
- You Don’t Know JS: this & Object Prototypes
- What is“this”keyword in JavaScript?
- How does the“this”keyword work?
- JavaScript 深刻之从 ECMAScript 标准解读 this
- JS this
- this 的值到底是什么?一次说分明