Этот вопрос из теста ECMA-262

var x = 100;
var foo = {
  x: 50,
  bar: function(){
    return this.x;
  }
}
console.log(foo.bar()); //returns 50
console.log((foo.bar = foo.bar)()); //returns 100

Как изменяется контекст this во втором выражении console? или вообще какой объект равно (присваивая) операции возвращает глобальный объект?

4
Mudassir Ali 29 Янв 2013 в 22:49

2 ответа

Лучший ответ

foo.bar (оператор-член) оценивается как Ссылка" свойство "bar" на объекте ", и это будет обрабатываться особенным образом, когда < a href = "http://es5.github.com/#x11.2.3" rel = "nofollow"> вызывая его .

(foo.bar = foo.bar) (назначение) просто возвращает назначенное значение, и его вызов приведет к в глобальном объекте, который используется как this .

3
Bergi 29 Янв 2013 в 19:04

foo.bar = foo.bar возвращает функцию foo.bar, которая затем вызывается через (...)(). Поскольку функция не была вызвана как свойство объекта foo, ее this будет не объектом foo, а в этом случае глобальным объектом.

2
Musa 29 Янв 2013 в 19:00