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

Пространства имен были однажды соображение для ECMAScript (старый ECMAScript 4), но были вынуты. Поскольку Brendan Eich говорит в этом сообщении:

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

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

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

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

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

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

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

7
задан Shog9 17 August 2010 в 23:34
поделиться

2 ответа

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

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

var myVar = "cool";

Этот процесс получит еще один уровень сложности, связанный с пространством имен.

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

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

window.localization.en = $.extend(window.localization.en || {}, {
  ...
});
2
ответ дан 7 December 2019 в 16:41
поделиться

Сначала ОК Некоторые термины:

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

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

onclick=' var mymark = "donethat";'

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

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

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

1
ответ дан 7 December 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: