Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переменные - мои злейшие враги (https://javascript.ru/forum/misc/24702-peremennye-moi-zlejjshie-vragi.html)

function 11.01.2012 09:57

Переменные - мои злейшие враги
 
Привет всем. Делаю програму, столкнулся с паролями... Вобщем то не в паролях дело, а в одной переменной:

var p=0;

function zapros()
{window.alert('p = '+p+' | из начала функции ');
if (p!=1)
{window.alert('p = '+p+' | если р не 1 ');
if (prompt('Введите пароль.', '')=='13u')
{s();p=1;}}

else 
{window.alert('p = '+p+' | из если р - 1 ');s();}}

function s()
{if (confirm('В следующий раз запрашивать пароль?')==true)
{p=0;
window.alert('p = '+p+' | р изменён ');}}


Переменная р в функции s обнуляется, но когда я снова обращаюсь к функции zapros она равна 1. Консоль ошибок невыдаёт, код тоже вроде правильный. В чём дело???

Kolyaj 11.01.2012 10:03

Для начала в форматировании кода. У вас вообще непонятно, какой код к чему относится.

function 11.01.2012 10:17

var p=0;

  function zapros()
{

// Окно для проверки -->
window.alert('p = '+p+'| из начала функции ');
// Окно для проверки -->

 if (p!=1)
{
// Окно для проверки -->
window.alert('p = '+p+'| если р не 1 ');
// Окно для проверки -->


// Окно для ввода паролей (сравниваем введённый с правильным) -->
 if (prompt('Введите пароль.', '')=='13u')
{s();p=1;}}
// Окно для ввода паролей (сравниваем введённый с правильным) -->

else 
{// Окно для проверки -->
window.alert('p = '+p+'| из если р - 1 ');
// Окно для проверки -->
s();}}

function s()
{// Спрашиваем "В следующий раз запрашивать пароль?" -->
if (confirm('В следующий раз запрашивать пароль?')==true)
{// Спрашиваем "В следующий раз запрашивать пароль?" -->
{p=0;
window.alert('p = '+p+'| р изменён ');}}}


// Там где-то есть кнопка по нажатию которой запускаеттся функция zapros() ... -->

Kolyaj 11.01.2012 10:24

Форматирование кода -- это не комментарии, которые зачем-то переводят код на русский язык. Это отступы и пробелы, которые помогают читать код.

А где вы обращаетесь к функции zapros?

function 11.01.2012 10:30

Вот полный код

<html>
<head>
<title>тест</title>

<meta http-equiv="content-type" content="text/html; charset="UTF 8">

<script>


var p=0;

  function zapros()
{

// Окно для проверки -->
window.alert('p = '+p+'| из начала функции ');
// Окно для проверки -->

 if (p!=1)
{
// Окно для проверки -->
window.alert('p = '+p+'| если р не 1 ');
// Окно для проверки -->


// Окно для ввода паролей (сравниваем введённый с правильным) -->
 if (prompt('Введите пароль.', '')=='13u')
{s();p=1;}}
// Окно для ввода паролей (сравниваем введённый с правильным) -->

else 
{// Окно для проверки -->
window.alert('p = '+p+'| из если р - 1 ');
// Окно для проверки -->
s();}}

function s()
{// Спрашиваем "В следующий раз запрашивать пароль?" -->
if (confirm('В следующий раз запрашивать пароль?')==true)
{// Спрашиваем "В следующий раз запрашивать пароль?" -->
{p=0;
window.alert('p = '+p+'| р изменён ');}}}


// Там где-то есть кнопка по нажатию которой запускаеттся функция zapros() ... -->


</script>
</head>
<body>


<input type="button" value="-для админа-" onclick=zapros()>

</body>
</html>


З.Ы. -
Цитата:

Сообщение от function
но когда я снова обращаюсь к функции zapros она равна 1

Через раз - 1 раз нормально работает а второй так.

Nekromancer 11.01.2012 10:39

p < глобальная переменная
s(); < здесь вы ей устанавливаете значение 0
p=1; < а здесь снова 1

function 11.01.2012 10:52

Ну ясно тогда.

art13 11.01.2012 12:55

Сам как то думал как и почему, пока не сказали что я локально внутри функции объявил такую же переменную))) при существовании глобальной

trikadin 11.01.2012 14:31

Через var надо объявлять, во-первых, а во-вторых, надо нормальные названия давать, а не однобуквенные.

nerv_ 11.01.2012 17:05

Цитата:

Сообщение от trikadin
а во-вторых, надо нормальные названия давать, а не однобуквенные.

Узнаю себя :D Для меня так читается легче) Пользуюсь этим, как правило, в небольших (локальных) функциях.

B@rmaley.e><e 11.01.2012 17:50

Цитата:

Сообщение от function
Переменные - мои злейшие враги

Судя по Вашему нику, функциональное программирование — вот решение Вашей проблемы.

Livaanderiamarum 11.01.2012 17:52

Цитата:

Сообщение от nerv_ (Сообщение 149623)
Узнаю себя :D Для меня так читается легче) Пользуюсь этим, как правило, в небольших (локальных) функциях.

А иногда просто хрен придумаешь название абстрактной вещи в стиле "типа во здесьбудет результат проверки, которы я потом положу в функцию передам если проверка удалясь" и чтобы не думать как его назвать я называю
qqq

Kolyaj 11.01.2012 17:59

Цитата:

Сообщение от nerv_
Для меня так читается легче)

Главное, чтобы также легко такой код читался вами же через год. Только через год он почему-то не хочет легко читаться.

Livaanderiamarum 11.01.2012 18:02

Цитата:

Сообщение от Kolyaj (Сообщение 149631)
Главное, чтобы также легко такой код читался вами же через год. Только через год он почему-то не хочет легко читаться.

Главное это если пишешь что-то что тебе понадобится через год, то пиши к нему JSDoc и называй переменные как душе угодно.

Kolyaj 11.01.2012 18:06

JSDoc он про то, что делает функция, а не как она это делает. JSDoc пишется для того, кто будет использовать код, а не писать его.

Livaanderiamarum 11.01.2012 18:09

Цитата:

Сообщение от Kolyaj (Сообщение 149637)
JSDoc он про то, что делает функция, а не как она это делает. JSDoc пишется для того, кто будет использовать код, а не писать его.

Да, ты верно понял мою мысль.

Kolyaj 11.01.2012 18:50

Нет, я не сказал, что переменные можно называть, как угодно.

Livaanderiamarum 11.01.2012 18:51

Цитата:

Сообщение от Kolyaj (Сообщение 149647)
Нет, я не сказал, что переменные можно называть, как угодно.

и что? ЯЯЯЯ это сказал!

nerv_ 11.01.2012 21:45

Цитата:

Сообщение от Kolyaj
Главное, чтобы также легко такой код читался вами же через год. Только через год он почему-то не хочет легко читаться.

Я последнее время упор на комменты делаю. Пытаюсь расписать все от логики до тонкостей.
В vba, и не только, новичкам рекомендуют начинать объявление переменной с префикса типа данных. Честно, следовал этому правилу достаточно долго, но записи вида lСounter (счетчик типа Long) или dCurrentDate (d - Date, текущая дата) просто убивают. На данный момент предпочитаю делать примерно так:

/*
	Функция noName служит для того, чтобы...
	Передается:
		x - то-то
		z - то-то
	Возвращается:
*/
function noName(x, z) {
	// код функции с подробными (не тупыми) комментариями
}


Зачастую, комменты дольше пишу, чем код, чтобы мысль сформулировать предельно ясно :) В идеале - прочитал комментарии, и сразу все вспомнил, понял логику и механизм работы.
Кто знает, быть может со временем я изменю свою точку зрения...

Livaanderiamarum 11.01.2012 21:47

Почему /* а не /** ???

melky 11.01.2012 23:05

nerv_, JSDoc удобнее (имхо). я так же, как и ты, расписывал всё в комментах, но когда узнал про jsdoc, мигом перешёл "на тёмную сторону". у них такие вкусные печеньки - при долгом использовании jsdoc станет читаться и пониматься так же легко, как и обычные комментарии, а ещё всё это выводится с тултип сбоку при вызове чего-либо описанного.

trikadin 12.01.2012 00:12

Цитата:

Сообщение от Livaanderiamarum
А иногда просто хрен придумаешь название абстрактной вещи в стиле "типа во здесьбудет результат проверки, которы я потом положу в функцию передам если проверка удалясь" и чтобы не думать как его назвать я называю
qqq

tempResult, например)

Я за jsDoc и вменяемые названия переменных. Вы потратите чуть больше времени сейчас ради сохранения его в будущем)

Livaanderiamarum 12.01.2012 00:18

Цитата:

Сообщение от trikadin (Сообщение 149737)
tempResult, например)

Я за jsDoc и вменяемые названия переменных. Вы потратите чуть больше времени сейчас ради сохранения его в будущем)

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


Часовой пояс GMT +3, время: 03:34.