var obj = {};
var r1 = (obj[\'toString\'])();
var m1 = obj[\'toString\'];
var r2 = m1();
var r3 = (obj.toString)();
var m2 = obj.toString;
var r4 = m2();
>
This is actually a "special" behavior of the grouping operator (...):
1. Return the result of evaluating Expression. This may be of type Reference.
NOTE This algorithm does not apply GetValue to the result of evaluating Expression. The principal motivation for this is so that operators such as
deleteandtypeofmay be applied to parenthesised expressions.
So, this operator specifically does not call GetValue and thus does not return the function object itself but rather the whole reference, so that operations which expect a reference still work.
A Reference is basically an encapsulation of a value with an optional "base value" which is the object in case of a property access.