The effect of parenthesis with `this` binding in javascript

后端 未结 2 431
庸人自扰
庸人自扰 2020-12-20 00:59

I encounter a very tricky case:

class C {
  // class method are implicit in strict mode by default
  static method() { return this === undefined; }  
}

C.me         


        
2条回答
  •  悲哀的现实
    2020-12-20 01:50

    That's because C.method returns a reference like

    { base: C, referencedName: "method", strict: strictFlag }
    

    When you call it, JS obtains the function using GetValue with that reference, and provides the base of the reference (C) as the this value.

    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
    

    However, when you use the comma operator, you directly get the function, not the reference.

    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
    

    Since there is no reference, JS can't know the base object, so when you call it provides undefined as the this value.

    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
    

提交回复
热议问题