Помогите понять файл twgetters widget.js, замыкание в замыкании? - PullRequest
5 голосов
/ 18 апреля 2011

http://a2.twimg.com/a/1302724321/javascripts/widgets/widget.js?1302801865

Это настроено так на высоком уровне:

публичное пространство имен:

TWTR = window.TWTR || {};

Тогда закрытие:

(function() {
...

})(); // #end application closure

В рамках закрытия заявки:

TWTR.Widget = function(opts) {
    this.init(opts);
};
(function() {
    // Internal Namespace.
    var twttr = {};
})();

Некоторые методы помечены как общедоступные, другие - как частные, и, похоже, единственное различие заключается в соглашении об именах (частное начинается с подчеркивания '_').

Разработан ли он с использованием шаблона модуля?

Почему или какую выгоду вы получаете от закрытия в закрытии?

Поскольку они загружают widget.js до jquery, это означает, что виджет предназначен для запуска без jquery, поскольку порядок имеет значение правильно?

Просто пытаюсь извлечь уроки из этого!

1 Ответ

4 голосов
/ 18 апреля 2011

Это настроено так на высоком уровне:

публичное пространство имен:

TWTR = window.TWTR || {};

Это плохая практика кодирования, переменные должны всегда объявляться с помощью var. И в javascript нет «пространств имен», этот термин применяется к вышеуказанной конструкции, но он не совсем подходит. Проще говоря, его методы содержатся в объекте.

Тогда закрытие:

> (function() { ...
> 
> })(); // #end application closure

Этот шаблон стал называться немедленно вызванным выражением функции или iife . Не уверен, что мне нравится это имя, но вот, пожалуйста. В любом случае, это не обязательно создает какие-либо полезные замыкания. Замыкание полезно только в том случае, если функция создает переменные, которые становятся связанными с каким-либо другим контекстом выполнения, который сохраняется после срока действия функции, которая их создала (я надеюсь, что она не читается как gobbledy-goop). Вам не нужно iife для создания замыкания.

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

В рамках закрытия заявки:

> TWTR.Widget = function(opts) {
>     this.init(opts); }; (function() {
>     // Internal Namespace.
>     var twttr = {}; })();

Некоторые методы помечены как общедоступные, другие личное, и единственное отличие кажется быть соглашением об именах (частный начинается с подчеркивания '_').

Использование «public» и «private» немного вводит в заблуждение в javascript. Использование подчеркивания для запуска имен идентификаторов указывает на то, что следует использовать только в текущей области или в самом коде «библиотеки». Это немного избыточно, так как код должен иметь опубликованный API, и любой метод, который не является частью API, не должен быть доступен извне.

Но это в основном вопрос стиля кодирования и личных предпочтений.

Разработан ли он с использованием шаблона модуля?

«Шаблонный модуль» Ричарда Корнфорда - это просто шаблон. Это удобно для имитации «приватных» переменных в javascript, а также для обмена свойствами между функциями или методами, отличными от обычного наследования прототипа. widget.js может быть реализован (по частям) с использованием шаблона модуля, но, скорее всего, он был разработан с учетом требований и функциональности. ; -)

Почему или какую выгоду вы получаете от закрытия в закрытии?

Точно такие же преимущества любого закрытия, как указано выше. Доступ к переменным, по сути, путем помещения их в соответствующую часть цепочки областей действия, по сути, такой же, как и доступ к свойствам через цепочку [[prototype]], только с (очень разной) механикой - один использует разрешение идентификаторов в цепочке областей действия, другое свойство разрешение по цепочке [[prototype]].

Редактировать

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

* * Например, тысяча шестьдесят-два
var foo = (function() {

  // Variables available for closure
  var a, b, c;

  // Use a, b, c for stuff
  ...

  // Only want closure to c
  a = null;
  b = null;

  return function() {
    // use c
  }
}());

Поскольку они загружают widget.js перед jquery, это означает, что виджет предназначен для запуска без jquery, поскольку порядок имеет значение правильно?

Сейчас я не могу получить доступ к связанному ресурсу (корпоративная блокировка домена Twitter), но порядок загрузки показывает, что вы правы. Однако выполнение некоторого кода может быть отложено до полной загрузки документа, поэтому это не является гарантией, вам нужно взглянуть на код.

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