Почему пространства имен были удалены из рассмотрения ECMAScript? - PullRequest
7 голосов
/ 06 марта 2010

Пространства имен когда-то были рассмотрением для ECMAScript (старый ECMAScript 4), но были исключены. Как говорит Брендан Эйч в это сообщение :

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

Плюс, так как некоторые JS-разработчики имеют с озабоченностью отметил, несколько открытых
пространства имен накладывают затраты времени выполнения, если реализация работ
значительно сложнее.

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

Но я не уверен, что понимаю все это. Что именно является механизмом расстановки приоритетов или резервирования и зачем нужен какой-либо из них? Кроме того, раннее связывание и пространства имен должны идти рука об руку? По некоторым причинам я не могу обернуться вокруг проблем. Может кто-нибудь попытаться дать более конкретное объяснение?

Кроме того, почему пространства имен налагают затраты времени выполнения? По-моему, я не могу не видеть небольшую разницу в концепции между пространством имен и функцией, использующей замыкания. Например, Yahoo и Google имеют объекты YAHOO и Google, которые «действуют как» пространства имен в том смысле, что они содержат все свои открытые и закрытые переменные, функции и объекты в одной точке доступа. Так почему же тогда пространство имен будет значительно отличаться в реализации? Может быть, у меня просто неправильное представление о том, что такое пространство имен.

Ради награды я хотел бы знать две вещи:

  1. Нужно ли раннее связывание пространства имен?
  2. Как работает реализация пространства имен отличаются от объекта с частные участники?

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Если вы объявляете переменную в замыкании после того, как определение функции вызовет эту переменную, она все еще использует переменную области действия.

function ShowMe() { 
    alert(myVar); //alerts "cool"
}

var myVar = "cool";

Этот процесс усложнит еще один слой в отношении пространства имен.

Помимо этого, существует множество методов пространства имен, а также команды расширения / applyIf и т. Д., Которые могут выполнять практически те же функции. namespace () в ExtJS или $ .extend в jQuery, например. Таким образом, это может быть приятно иметь, но не является абсолютной необходимостью в конструкциях языка. Я думаю, что формализация некоторых расширений для Array и поддержка дат в ISO-8601 в Date намного важнее. Из-за необходимости просто проверять каждый слой пространства имен для определения ...

window.localization = $.extend(window.localization || {}, {
  ...
});

window.localization.en = $.extend(window.localization.en || {}, {
  ...
});
1 голос
/ 23 марта 2010

OK сначала Некоторые термины:

  • Раннее связывание - проверка / проверка при разборе строки кода.
  • Позднее связывание - проверка / подтверждение при выполнении строки кода.
  • Расстановка приоритетов / резервирование - я думаю, что они имеют в виду, что если вы делаете раннее связывание и проверяете пространства имен при разборе кода, то должен быть процесс проверки имени переменной, когда переменная добавляется динамически позже и другой набор правила для того, что является действительным, поскольку на данный момент может быть задействовано несколько областей действия.

Я искренне удивлен, что были приведены только эти вполне технические причины. Возьмите общий случай: -

onclick=' var mymark = "donethat";'

Какому пространству имен должен принадлежать «mymark»? Кажется, нет простого ответа на этот вопрос. Особенно учитывая, что фрагмент кода: -

window.forms.myform.mybutton.onClick = ' var mymark = "donethat";'

Следует поместить переменную в том же пространстве имен.

...