Почему пространства имен были удалены из рассмотрения ECMAScript?

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

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

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

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

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

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

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

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

2 ответа

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

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 || {}, {
  ...
});

Хорошо, сначала немного из терминологии:

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

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

onclick=' var mymark = "donethat";'

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

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

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

Другие вопросы по тегам