在javascript中使用`this`绑定括号的效果

时间:2017-01-08 05:31:33

标签: javascript ecmascript-6

我遇到了一个非常棘手的案例:

.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)的绑定?

2 个答案:

答案 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