Вложенная функция внутри литерального объекта - PullRequest
6 голосов
/ 18 апреля 2010

Если в литеральном объекте я пытаюсь ссылаться на функцию, используя «this» внутри вложенного свойства / функции, это не работает Зачем? Вложенное свойство имеет собственную область видимости?

Например, я хочу вызвать f1 изнутри d.f2:

var object = {    

  a: "Var a",
  b: "Var b",
  c: "Var c",

  f1: function() {
    alert("This is f1");
  },

  d: {
      f2: function() {
       this.f1();
    }
  },

  e: {
      f3: function() {
        alert("This is f3");
     }
  }
}

object.f1 (); // Работа
object.d.f2 (); // Не работаю. object.e.f3 (); // Работа

Спасибо, Андреа.

Ответы [ 2 ]

9 голосов
/ 18 апреля 2010

this относится к d внутри f2, а не object.Вы можете сохранить ссылку на объект, либо вызвать object напрямую, либо использовать call / apply, чтобы вызвать функцию и явно сказать ей, что означает this внутри этой функции:

object.d.f2.call(object); // now this refers to object inside f2
4 голосов
/ 18 сентября 2013

Вот альтернативный подход, который не меняет контекст this внутри f2(), основанный на идее @ slaver113 :

var object = (function() {
  var _this = {
    f1: function() {
      alert('This is f1');
    },
    d: {
      f2: function() {
        _this.f1();
      }
    }
  }

  return _this;
})();

object.d.f2(); // Alerts 'This is f1'
...