Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, c-smile, Вы писали:
К>[cut] CS>>Как будет себя вести скажем Питон в аналогичном случае? CS>>"1" и "100"
К>А чего странного? К>Внутри функции в питоне создаётся локальная переменная и её значение возвращается функцией, всё более чем предсказуемо.
Здравствуйте, c-smile, Вы писали:
CS>if you will remove this line:
CS>
CS>if(false) { var somevar; }
CS>
CS>result in JS will be "1" and "1"
А блин, ты запутал с языками, приводишь код на JS с просьбой дать ответ, результат на tiscript, а вопрос про питон.
Поясни, как ты приведённую строку на питоне напишешь? Или питон был был так просто "до кучи", а претензии к JS?
CS>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)
CS>Как будет себя вести скажем Питон в аналогичном случае?
"Аналогичного случая" для Питона не будет, потому что нет аналога двум действиям:
1. Какой-то код после return. За редчайшими исключениями, в Питоне все команды исполняемые.
2. Нет аналога оператору var. Необъявленная ранее переменная вводится имплицитно. Наоборот, для использования внешней переменной надо написать "global var" (если она на уровне модуля).
Поэтому — твой подход просто некорректен, а что ты решил назначить тут "аналогичным случаем" в Питоне — рассказывай сам (просто покажи код). Дальше посмотрим, аналогично это или нет.
CS>>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)
CS>>Как будет себя вести скажем Питон в аналогичном случае?
N>"Аналогичного случая" для Питона не будет, потому что нет аналога двум действиям: N>1. Какой-то код после return. За редчайшими исключениями, в Питоне все команды исполняемые.
Не понял про "все команды исполняемые"... Можем переписать так
В JS как и в C/C++ identifier означает либо локальную переменную либо глобальную.
Проблема состоит в том что 1) все имена/перменные внутри функции попадают в один общий namespace и 2)
если где-то в недрах функции встретилось это имя с приставкой var то оно меняет суть *всех*
обращений к somevar втсретившихся и после и самое неприятное — до.
Такое решение представляется
1) конкретной засадой. Где-то в глубине функции кто-то напишет безобидный { var somevar; } и все — концов не найдешь в коде до него.
2) Означает что строго говоря прямая интерпретация JS невозможна — только через компиляцию и/или построение AST.
N>2. Нет аналога оператору var. Необъявленная ранее переменная вводится имплицитно. Наоборот, для использования внешней переменной надо написать "global var" (если она на уровне модуля).
CS>(попробуйте предсказать вывод тех alert()ов, ответ для ленивых в конце сообщения)
CS>Как будет себя вести скажем Питон в аналогичном случае? CS>Мой tiscript например выведет два раза "1".
JS печально известен своим идиотским правилом, что у него один scope на тело функции. Второго такого языка, возможно и нет. Починить это можно так (я как то переписывал код с JS и долго не мог понять зачем это нужно):
somevar = 100;
function test()
{
somevar = 1;
return somevar;
(function(){
if(false) { var somevar; }
})();
}
JavaScript: The Good Parts By Douglas Crockford:
...
JavaScript's syntax comes from C. In all other C-like languages, a block (a set of statements wrapped in curly braces) creates a scope. Variables declared in a block are not visible outside of the block. JavaScript uses the block syntax, but does not provide block scope: a variable declared in a block is visible everywhere in the function containing the block. This can be surprising to programmers with experience in other languages.
In most languages, it is generally best to declare variables at the site of first use. That turns out to be a bad practice in JavaScript because it does not have block scope. It is better to declare all variables at the top of each function.
Re: [js] А вот интересно ...>>JS печально известен своим идиотским правилом, что у него один scope на тело функции. Второго такого >>языка, возможно и нет. Починить это можно так (я как то переписывал код с JS и долго не мог понять >>зачем это нужно):
Ну какбы всякие Python, php тоже с таким вот идиотским правилом
Здравствуйте, meandr, Вы писали:
M>Re: [js] А вот интересно ...>>JS печально известен своим идиотским правилом, что у него один scope на тело функции. Второго такого >>языка, возможно и нет. Починить это можно так (я как то переписывал код с JS и долго не мог понять >>зачем это нужно):
M>Ну какбы всякие Python, php тоже с таким вот идиотским правилом:-))
Угу — по сравнению с ними Perl с его my выглядит значительно приятнее (я уж не вспоминаю, что local играет роль ещё и try-finally для замены переменной или элемента хэша). Питоновый вариант по сравнению с ним сильно урезан и крив. С другой стороны, само требование явно объявить необходимость доступа к внешней переменной через global является хорошей защитой от глупых ошибок...
CS>>?
N>Нет, не проходит компиляцию. Если бы проходило — было бы точно так же, как Вы описываете для JS. Указать как global нужно до первого использования.
А если в какой субблок засунуть?
Ну типа:
def test():
nlist = 1
if true:
global nlist
return nlist
(Не уверен за правильность нотации, извиняюсь, но мысль должна быть понятна)
Т.е. есть ли у Python block scopes? Или тоже все внавал лежит?