Проблема с областью размещения объектов Javascript - PullRequest
3 голосов
/ 24 июня 2011

Я пишу некоторый код Javascript, используя jQuery для отображения специально отформатированных виджетов в браузере.Я добился успеха, но сейчас я работаю над рефакторингом своего кода по двум причинам.

(1) Я хочу иметь возможность легко использовать виджет более одного раза и иметь объект Javascript, ссылающийся на каждыйone.
(2) Я хочу сделать это правильно, чтобы мой код был полностью пригоден для повторного использования и не ограничивал глобальное пространство имен всеми видами объектов и функций.

У меняпроблема с областью видимости, и я хочу решить проблему и улучшить мое понимание области видимости Javascript.Я сжал эту проблему до крошечного фрагмента кода, который иллюстрирует, что я делаю:

  function getMyObject() {
      var theObject = {
          doThis: function () { },
          doThat: function () { },
          combinations: {
              doThisTwice: function () { doThis(); doThis(); },
              doThatTwice: function () { doThat(); doThat(); }
          }
      };
      return theObject;
  }

  var myObject = getMyObject();
  myObject.combinations.doThisTwice();

Я объявил функцию, которая возвращает объект.

Однако, когда япопробуйте выполнить функцию combinations.doThisTwice(), программа выдаст ошибку, сообщающую, что doThis() находится вне области видимости.Как мне обратиться к функции doThis в области действия combinations.doThisTwice?

Обновление: Спасибо за ответ на мой вопрос: заменить doThis() на theObject.doThis()внутри функции doThisTwice().Это работает, но я не понимаю, почему.

Я бы подумал, что имя theObject будет недействительным до конца объявления объекта.Я думаю, что я должен неправильно понять какой-то фундаментальный аспект Javascript ... возможно, из-за синтаксиса, подобного С.

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Вам нужно сделать:

function getMyObject() {
    var theObject = {
        doThis: function () { },
        doThat: function () { },
        combinations: {
            doThisTwice: function () { theObject.doThis(); theObject.doThis(); },
            doThatTwice: function () { theObject.doThat(); theObject.doThat(); }
        }
    };
    return theObject;
}

var myObject = getMyObject ();myObject.combination.doThisTwice ();

Вы ссылаетесь на 'theObject' из внешней области видимости, чтобы вызвать функции во внутреннем объекте.

2 голосов
/ 24 июня 2011

doThis не определено в области видимости функций, поэтому будет проходить по цепочке областей действия, но не найдет ее.

Вы можете сослаться на это по

theObject.doThis();

Однако, более читабельным может быть, если вы определите свою функцию следующим образом:

  function getMyObject() {
      function doThis() {};
      function doThat() {};

      var theObject = {
          doThis: doThis,
          doThat: doThat,
          combinations: {
              doThisTwice: function () { doThis(); doThis(); },
              doThatTwice: function () { doThat(); doThat(); }
          }
      };
      return theObject;
  }

Но в этом случае, когда вы изменяете doThis извне, doThisTwice все равно будет ссылаться на исходную функцию.

0 голосов
/ 24 июня 2011

В doThisTwice, используйте theObject.doThis(); вместо doThis();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...