- 1
- 2
- 3
- 4
- 5
- 6
n = 0
for i in range(n):
pass
print i
NameError: name 'i' is not defined
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−146
n = 0
for i in range(n):
pass
print i
NameError: name 'i' is not defined
Тут i будет равным 0
Значит, придётся думать в рамках концепции foreach.
1) падать с треском?
2) добавлять undefined?
3) автоматически инициализиовать None
?
Но смех в том, что если ты _читаешь_ переменную, и такая переменная есть в верхнем скопе, то ты обращаешься к ней. А если пишешь -- то создаешь новую переменную, если только не указал global.
Так что скопы есть, просто они немного необычны
Единственный из языков с фигурной скобочкой который так делает. Нежданчик (один из немногих) для сишников, джавистов, пхпистов итд.
ну и
$переменная;
>$переменная
отработает
1. В языках со словом var по умолчанию всё наследуется, а var указывает на локальную видимость.
2. В языках без слова var по умолчанию ничего не видно, поэтому нужно явно указать, что передавать (nonlocal в Питоне, use в PHP).
Ответ на вопрос, какая из концепций «более правильная», оставим любителям холиваров.
Говно ваш "ЭКМАскрипт", переходите на "PHP".
Объекты есть, а классов нет. Не завезли
Объявить новый тип данных/класс в JS нельзя.
google: классы в javascript
Найдёшь целое поле, засеянное костылями и велосипедами.
P.S. Домашнее задание: написать, как в JS будет выглядеть аналог наследования.
> Если же тебе нужны ещё экземпляры того же класса, ты просто клонируешь однажды созданный объект столько раз, сколько экземпляров нужно.
Так можно. А если через new? Как минимум, методы будут присобачены к другому объекту (прототипу) и не скопируются. А поля, определённые в конструкторе скопированы не будут, а создадутся заново вместе с новым экземпляром.
Но и с какой точки зрения? В коде объявление будет выглядеть как класс, при использовании new будет выглядеть как единовременное создание, да и оптимизация в v8, кажется, собирала все поля из конструктора в единую структуру.
> Объявить новый тип данных/класс в JS нельзя.
Но почему? Есть же специальные конструкции вроде function...prototype для определения классов, new для создания экземпляров, а также instanceof для проверки принадлежности к классу. Всё сделано для того, чтобы определить класс и создавать его объекты.
Если же в жс нельзя объявить новый тип/класс, то и в жабе нельзя, поскольку любой тип пользователя там будет просто модифицированным Object, а ключевое слово class - просто для отвода глаз.
Насколько я помню, в хаскеле можно только конструировать, в крестах - преобразовывать и инициализировать в списке инициализации и творить чушь в теле конструктора, в жс - только творить чушь в теле конструктора.
Но, насколько я помню, Майерс показывал, что в крестах уместнее использовать список инициализации, а не творить чушь.
А в жс конструктор без побочных эффектов - высшее благо:
Здесь за счёт того, что конструктор Downloader только инициализирует данные, а не вызывает для удобства метод download, удалось (1) без побочных эффектов создать объект-прототип класса-наследника (2) без побочных эффектов инициализировать поля класса-родителя для каждого объекта класса-наследника, чтобы они не стали статическими для класса-наследника (3) найти простой масштабируемый механизм наследования:
Выходит, надо упрощать конструкторы до инициализации?
Конструктор должен возвращать экземпляр типа. Если левую питушню можно навесить на левую функцию - навесь. Не усложняй конструктор свой.
http://ideone.com/kFZ1qx
А ведь, кажется, в споре одновозвратники упоминали простоту логирования. Но, "нагрешив" императивно в конструкторе и деструкторе, получаем милоту.
В хаски для нетривиальной инициализации есть идиома smart constructor. А родные конструкторы нужны в основном для сопоставления с образцом.
В большинстве остальных языков конструкторы (включая жабу) - не более чем обычная функция, вызываемая в нужный момент. Кмк, там их можно безболезненно выпилить, как сделали в Go и прочих оберонах.
В каком Питоне должно пройти?
Я забыл, каким словом захватывается родительский контекст...