Пространства имен были однажды соображение для ECMAScript (старый ECMAScript 4), но были вынуты. Поскольку Brendan Eich говорит в этом сообщении:
Один из примеров использования для пространств имен в ES4 был ранним связыванием (используйте внутреннее пространство имен), и для производительности и для понимания программиста - никакой шанс привязки имени во время выполнения, не соглашающейся с любой более ранней привязкой. Но раннее связывание в любом динамическом коде, загружающем сценарий как сеть, требует, чтобы механизм установления приоритетов или резервирования избежал рано по сравнению с конфликтами позднего связывания.
Плюс, как некоторые конструкторы JS отметили с беспокойством, несколько открываются
пространства имен налагают стоимость во время выполнения, если реализация не работает
значительно тяжелее.По этим причинам, пространствам имен и раннему связыванию (как пакеты прежде
их, это в прошлом апреле), должен пойти.
Но я не уверен, что понимаю все это. Что такое точно механизм установления приоритетов или резервирования и почему любой из тех был бы необходим? Кроме того, раннее связывание и пространства имен должны идти рука об руку? По некоторым причинам я не могу перенести голову вокруг включенных проблем. Кто-либо может делать попытку более изложенного в деталях объяснения?
Кроме того, почему пространства имен наложили бы затраты во время выполнения? В моем уме я не могу не видеть мало различия в понятии между пространством имен и функцией с помощью закрытий. Например, Yahoo и Google и имеют YAHOO и объекты Google, что "действие как" пространства имен в этом они содержат все свои общедоступные и частные переменные, функции и объекты в единой точке доступа. Итак, почему, затем, пространство имен так существенно отличалось бы в реализации? Возможно, у меня просто есть неправильное представление относительно того, что пространство имен точно.
Ради щедрости я хотел бы знать две вещи:
Если вы объявите переменную в закрытии после того, как определение функции вызовет эту переменную, она все равно будет использовать скопированную переменную.
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 || {}, {
...
});
Сначала ОК Некоторые термины:
Я искренне удивлен, что были приведены только эти чисто технические причины. Возьмем общий случай: -
onclick=' var mymark = "donethat";'
Какому пространству имен должен принадлежать mymark? На этот вопрос, кажется, нет простого ответа. Особенно с учетом того, что фрагмент кода: -
window.forms.myform.mybutton.onClick = ' var mymark = "donethat";'
должен помещать переменную в то же пространство имен.