Nature of JS bound functions and function invocation operator

前端 未结 3 1974
遇见更好的自我
遇见更好的自我 2020-12-11 08:17
var obj = {};

var r1 = (obj[\'toString\'])();
var m1 = obj[\'toString\'];
var r2 = m1();

var r3 = (obj.toString)();
var m2 = obj.toString;
var r4 = m2();
         


        
3条回答
  •  长情又很酷
    2020-12-11 08:53

    Turns out that function invocation operator looks back on what is the context. I would expect operator to not know where operands come from.

    In fact, it does know.

    In the EcmaScript specification this is described by the property accessor operators (and a few similar operations) to return a "Reference object" that holds exactly this information: the context on which the property was accessed. Any "normal" operations will usually just get the reference's value - including the assignment operators, which do dissolve the reference in your case.

    The call operator uses this to make method calls special:

    1. Let ref be the result of evaluating MemberExpression. which may return a Reference
    2. Let func be GetValue(ref). which fetches the actual function object - you see this operation a lot in the spec
    3. fetch arguments, do some type assertions
    4. If Type(ref) is Reference, then
      • If IsPropertyReference(ref) is true, then
        Let thisValue be GetBase(ref). <- here the method context is fetched
      • Else, the base of ref is an Environment Record
        which basically describes variables inside a with statement
    5. Else, Type(ref) is not Reference.
      Let thisValue be undefined.

提交回复
热议问题