Показать сообщение отдельно
  #2 (permalink)  
Старый 10.12.2011, 14:49
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

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 будет использована та самая база, которую мы потеряли при вычислении значения.

Последний раз редактировалось B@rmaley.e><e, 10.12.2011 в 15:11.
Ответить с цитированием