Javascript singleton: доступ к внешнему атрибуту из внутренней функции - PullRequest
1 голос
/ 09 июля 2010
// i = inner, o = outer, f=function, a=attribute
var singleton = function() {
 var iF = function() {
    return this.oA; // returns undefined
 }
 return {
  oF: function() {
   this.oA = true;
   return iF();
  },
  oA: false
 };
}();

singleton.oF();

Если бы синглтон был class (как в языке на основе классов), я не мог бы иметь доступ к oA через this.oA?

Я нашел единственный способ доступа к oA из iF, выполнив:

return singleton.oA; // returns true (as it should)

Я не знаю почему, но доступ к oA через базовый объект singleton заставляет меня чувствовать себя немного ... грязным. Что мне не хватает? Что на самом деле относится к this.oA (в широком смысле)?

1 Ответ

1 голос
/ 09 июля 2010

Суть в том, что нет классов в javascript .Тебе нужно жить без них.Вы можете только эмулировать некоторые их характеристики .

Ключевое слово this в javascript относится к объекту, который вызвал функцию.Если это функция в глобальном объекте, this будет ссылаться на window.Если это constructor function, и вы вызываете его с ключевым словом new, this будет ссылаться на текущий экземпляр.

Есть простая вещь, которую вы можете сделать, если хотите сохранить oA public и доступ к ней из приватной функции.

// i = inner, o = outer, f=function, a=attribute
var singleton = (function() {

 // public interface
 var pub = {
  oF: function() {
   this.oA = true;
   return iF();
  },
  oA: false
 };

 // private function
 var iF = function() {
    return pub.oA; // returns public oA variable
 }

 // return public interface
 return pub;
})();​

Обратите внимание, что я завернул всю единственную функцию в паранах .Причина, по которой это соглашение настолько популярно, заключается в том, что помогает узнать, будет ли функция выполняться немедленно (как в этом случае).Представьте себе, если ваша функция становится больше , и когда вы смотрите на код, не будет очевидным , если singleton - это функция или объект, который возвращает самовозбуждающаяся функция.Однако, если у вас есть парены, очевидно, что функция синглтона будет возвращена функцией немедленно.

...