为什么在 `JavaScript(ECMA-262 5.1)` 中调用函数的 `Type` 不是 `reference`?
Why is `Type` of calling function not `reference` in `JavaScript(ECMA-262 5.1)`?
当我试图找出 this
关键字的所有细节时,我的问题出现了。到目前为止,我通过阅读 ECMAScript® 语言规范部分 10.4.3 Entering Function Code and 11.2.3 Function Call 了解了这个值是如何设置的。在玩一些代码的时候,我的问题出现了,请看下面的代码。
"use strict";
function test(){
alert(this); //undefined
};
test();
根据 10.4.3 Step 1, given thisArg
is assigned to this
value in strict mode
. And according to 11.2.3 步骤 7,仅当 Type(ref)
不是 reference
时,thisArg 才未定义。
所以我的问题是,为什么在这种情况下 Type(ref)
不是 reference
?
第 7 步在这种情况下无关紧要,因为它是第 6 步之后的 else,即:
6.If Type(ref) is Reference, then
a.If IsPropertyReference(ref) is true, then
i.Let thisValue be GetBase(ref).
b.Else, the base of ref is an Environment Record
i.Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).
在您的例子中,test
是一个引用,不是一个PropertyReference,所以使用了ImplicitThisValue。在严格模式下,该值为 undefined
.
当我试图找出 this
关键字的所有细节时,我的问题出现了。到目前为止,我通过阅读 ECMAScript® 语言规范部分 10.4.3 Entering Function Code and 11.2.3 Function Call 了解了这个值是如何设置的。在玩一些代码的时候,我的问题出现了,请看下面的代码。
"use strict";
function test(){
alert(this); //undefined
};
test();
根据 10.4.3 Step 1, given thisArg
is assigned to this
value in strict mode
. And according to 11.2.3 步骤 7,仅当 Type(ref)
不是 reference
时,thisArg 才未定义。
所以我的问题是,为什么在这种情况下 Type(ref)
不是 reference
?
第 7 步在这种情况下无关紧要,因为它是第 6 步之后的 else,即:
6.If Type(ref) is Reference, then
a.If IsPropertyReference(ref) is true, then
i.Let thisValue be GetBase(ref).
b.Else, the base of ref is an Environment Record
i.Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).
在您的例子中,test
是一个引用,不是一个PropertyReference,所以使用了ImplicitThisValue。在严格模式下,该值为 undefined
.