2014-10-29 3 views
0

Я пытаюсь получить имя пользователя для сайта, используя подсказку javascript. Если пользователь нажимает на отмену, запрос должен появиться снова или если он вводит пустое значение, запрос должен появиться снова.при вызове функции внутри себя возвращаемое значение не совпадает во втором вызове

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

function getusername() 
{ 
    var user = prompt("Please Enter Your Username"); 
    if(user == null || user == "") 
    { 
    getusername(); 
    } 
    else 
    { 
    return user; 
    } 
} 

, когда я называю это как alert(getusername()); значение приходит в первый раз, но если я нажимаю отменить в первой строке и введите имя пользователя во второй строке, предупреждение не определено. Пожалуйста, помогите мне.

ответ

2

Другие упомянули, что вам не хватает return в случае, если вы не получили требуемый вход.

Но, в общем, проблема с вашим методом заключается в том, что он ненужно использует recursion. Вызывая getusername() из себя, вы завершаете стек вызовов, который может вырасти настолько же глубоко, как количество недопустимых входных данных, которые вы получаете. Теоретически, если пользователь должен был просто нажать на ввод в пустое приглашение, вы можете создать stack overflow.

Иногда рекурсия идеально подходит для решения проблемы, и если вы ее не используете, вы соберетесь стрелять себе в ногу. Но это пример для случая, когда вы, вероятно, лучше всего подходит что-то вроде времени цикла:

function getusername() { 
    var user = null; 
    while (!user) { 
     user = prompt("Please Enter Your Username"); 
    } 
    return user; 
} 

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

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

+0

спасибо. HostileFork, я узнал новую вещь о рекурсии в javascript. – Vignesh

+1

@Vignesh Я хочу подчеркнуть, что не следует отнимать у этого, что «рекурсия плохая». может быть * очень хорошим * ... и является основой для постановки задачи с точки зрения меньших подзадач в пути [divide-and-conquer] (http://en.wikipedia.org/wiki/Divide_and_conquer_algorithms). Но подумайте о приостановке в отладчике после 10 недопустимых ответов на запросы ... вы хотите посмотреть в стеке вызовов и посмотреть функцию, которая называется getusername или 'getusername/getusername/getusername/getusername/getusername/getusername/getusername/getusername/getusername/getusername ... '? – HostileFork

+0

Да, я использовал рекурсию во встроенном c it там очень полезно. но я понимаю, что не использовал рекурсию в своем идеальном случае использования в этом коде. Спасибо. – Vignesh

2

Ваш if ветка ничего не возвращает. Когда функция не возвращает ничего, она неявно возвращает undefined, следовательно, ваше предупреждение. Вы должны вернуться из вашей if отрасли:

function getusername() 
{ 
    var user = prompt("Please Enter Your Username"); 
    if(user == null || user == "") 
    { 
    return getusername(); 
    } 
    else 
    { 
    return user; 
    } 
} 

Это делает else излишним, так что вы можете сократить ваш код немного (уведомление, что я также изменил условие !user которые должны охватывать все возможные здесь):

function getusername() 
{ 
    var user = prompt("Please Enter Your Username"); 
    if(!user) 
    { 
    return getusername(); 
    } 
    return user; 
} 

И это приводит к постоянно короткий однострочник:

function getusername() 
{ 
    return prompt("Please Enter Your Username") || getusername(); 
} 
+0

Да. Я только что заметил это и исправил и разместил свой собственный ответ ниже. в любом случае, спасибо. – Vignesh

+0

... @ Vignesh, и если вы продолжаете входить в приглашение, вы в конечном итоге получаете переполнение стека.: -/Один уровень глубины стека добавлен для каждого пустого ввода? – HostileFork

+0

так есть лучший способ @HostileFork – Vignesh

0

Я решил этот небольшое изменение,

function getusername() 
{ 
    var user = prompt("Please Enter Your Username"); 
    if(user == null || user == "") 
    { 
    return getusername(); 
    } 
    else 
    { 
    return user; 
    } 
} 
Смежные вопросы