var foo = {
bar: function () {
alert(this);
},
toString: function () {
return "Hello, I'm foo!"
}
};
window.toString = function () {
return "Hi, I'm a window"
};
foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo
*!*
(foo.bar, foo.bar)()
*/!*
Проблема не в операторе присваивания, а в том, что в скобках стоит выражение, которые требует вычисления.
В первых двух случаях, как ни странно, выражения перед скобками вызова () нет.
Плохо написал. Напишу согласно стандарту:
1.
Оператор группировки (те самые круглые скобки) не вызывает
вычисление значения. Таким образом, ссылка, обрамлённая скобками, остаётся ссылкой.
2. Все остальные операторы вызывают вычисление значения. Таким образом, для ссылки вычисляется объект, на который она указывает. При том, для (obj.fnc, obj.fnc) результатом будет значение obj.fnc, то есть fnc без указания базы, т.е. fnc "открепится" от obj.
3. При
вызове функции в качестве this будет использована та самая база, которую мы потеряли при вычислении значения.