Почему пространства имен были удалены из рассмотрения ECMAScript?
Пространства имен когда-то были рассмотрением для ECMAScript (старый ECMAScript 4), но были исключены. Как Брендан Эйч говорит в этом сообщении:
Одним из вариантов использования для пространств имен в ES4 было раннее связывание (используйте внутреннее пространство имен), как для производительности, так и для понимания программистом - нет никаких шансов того, что связывание имен во время выполнения не будет соответствовать какой-либо более ранней привязке. Но раннее связывание в любом сценарии динамической загрузки кода, например в Интернете, требует механизма расстановки приоритетов или резервирования, чтобы избежать конфликтов раннего и позднего связывания.
Кроме того, как с озабоченностью отмечают некоторые разработчики JS, несколько открытых
пространства имен накладывают затраты времени выполнения, если реализация не работает
значительно сложнее.По этим причинам пространства имен и раннее связывание (как пакеты до
им, это в апреле прошлого года) должны идти.
Но я не уверен, что понимаю все это. Что именно является механизмом расстановки приоритетов или резервирования и зачем нужен какой-либо из них? Кроме того, раннее связывание и пространства имен должны идти рука об руку? По некоторым причинам я не могу обернуться вокруг проблем. Может кто-нибудь попытаться дать более конкретное объяснение?
Кроме того, почему пространства имен навязывают затраты времени выполнения? По-моему, я не могу не видеть небольшую разницу в концепции между пространством имен и функцией, использующей замыкания. Например, Yahoo и Google имеют объекты YAHOO и Google, которые "действуют как" пространства имен в том смысле, что они содержат все свои открытые и закрытые переменные, функции и объекты в одной точке доступа. Так почему же тогда пространство имен будет значительно отличаться в реализации? Может быть, у меня просто неправильное представление о том, что такое пространство имен.
Ради награды я хотел бы знать две вещи:
- Нужно ли раннее связывание пространства имен?
- Чем реализация пространства имен отличается от объекта с закрытыми членами?
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";'
Следует поместить переменную в том же пространстве имен.