Как я могу безопасно получить доступ к другим родственным функциям и переменным в шаблоне модуля Javascript, не обращаясь к чему-либо в содержащей области? - PullRequest
4 голосов
/ 27 июля 2010

У меня есть объект Javascript, структурированный после шаблона модуля.У меня есть несколько частных функций, которые вызываются из других «частных» функций.Как я могу получить доступ к другой переменной / функции без возможности случайного доступа к глобальной / внешней переменной / объекту / функции?

function doSomething() {
  alert("Something I don't want to do");
}

var My.Namespaced.SingletonClass = (function() {
  var init = function() {
    doSomething();
  }

  var doSomething = function() {
    alert("Something I want to do");
  }

  return {
    "init": init;
  }
})();

My.Namespaced.SingletonClass.init();

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

1 Ответ

5 голосов
/ 27 июля 2010

Короткая версия: вы не можете.Если doSomething не определен как брат init, тогда JavaScript будет искать последовательно более широкие области, пока не найдет функцию doSomething или не хватит областей для поиска.

Более длинная версия:Вы можете предотвратить такое поведение, используя закрытый объект для хранения ваших личных вспомогательных функций, например:

function doSomething() {
  alert("Something I don't want to do");
}

// Assuming My.Namespaced is already defined:
My.Namespaced.SingletonClass = (function() {
  var helpers = {};

  helpers.doSomething = function() {
    alert("Something I want to do");
  }

  var init = function() {
    helpers.doSomething();
  }

  return {
    init: init
  }
})();

My.Namespaced.SingletonClass.init();

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

Также имейте в виду, что My и My.Namespaced должны быть определены, прежде чем вы добавите SingletonClass - и нет необходимости использовать цитирование в стиле JSONдля ключей в объекте, который вы возвращаете.

...