我遇到了一个非常棘手的案例:
.platform->Developer->SDKs
为什么class C {
// class method are implicit in strict mode by default
static method() { return this === undefined; }
}
C.method(); // => false
(0,C.method)(); // => true
在上述情况下更改(0, C.method)
的绑定?
答案 0 :(得分:5)
那是因为C.method
会返回类似
{ base: C, referencedName: "method", strict: strictFlag }
当你call it时,JS使用带有该引用的GetValue获取函数,并将引用的基数(C
)作为this
值。
CallExpression : MemberExpression Arguments
1. Let ref be the result of evaluating MemberExpression. // <-- The reference
2. Let func be ? GetValue(ref). // <-- The function
4. If Type(ref) is Reference, then
a. If IsPropertyReference(ref) is true, then
i. Let thisValue be GetThisValue(ref). // <-- C
但是,当您使用comma operator时,您直接获取函数,而不是参考。
Expression : Expression , AssignmentExpression
1. Let lref be the result of evaluating Expression.
2. Perform ? GetValue(lref). // <-- 0
3. Let rref be the result of evaluating AssignmentExpression.
4. Return ? GetValue(rref). // <-- The function
由于没有引用,JS无法知道基础对象,因此当您调用它时,undefined
提供this
值。
CallExpression : MemberExpression Arguments
1. Let ref be the result of evaluating MemberExpression. // <-- The function
2. Let func be ? GetValue(ref). // <-- The function
5. Else Type(ref) is not Reference,
1. Let thisValue be undefined. // <-- undefined
答案 1 :(得分:3)
在JavaScript中使用comma operator时,将评估两个操作数,然后返回最右侧的值。从括号中得出的评估函数值没有来自何处的上下文。这可以比作为变量赋值,其中赋值运算符=
的右侧在赋值之前进行求值:
(0, C.method)();
// ^^^^^^^^ evaluates here
var func = C.method;
// ^^^^^^^^ evaluates here
func();
将函数放入变量后,它会丢失它所来自的对象的所有上下文(除非使用bind
)。这个背景对determining the value of this
很重要。如果调用函数而不是对象的成员,则默认为全局对象,如果函数处于严格模式,则默认为undefined
。 (MDN)