2016-07-26 5 views
0

мой друг спросил меня, почему этот код не работает должным образом, отменив приглашение.Почему приглашение возвращает иногда null как строку

<script type="text/javascript"> 
    var name = prompt("Enter your name:", ""); 
    if (!name) { 
     name = "unknown";  
    } 
    var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");  
    document.write(ans);   
</script> 

Вот jsfidle https://jsfiddle.net/085svr3u/

я узнал, что в приведенном выше примере propmt возвращает "нуль", то есть. null как строка путем отмены. И я понятия не имею, почему.

Я попытался сыграть с оригинальным кодом и немного переработал его. Теперь он работает так, как ожидалось. Но у меня все еще нет объяснений.

<script type="text/javascript"> 

    function test() { 
     var name = prompt("Enter your name:", ""); 
     if (!name) { 
      name = "unknown";  
     } 
     var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");  
     document.write(ans);   
    } 

    test(); 
</script> 

А вот модифицируется версии https://jsfiddle.net/085svr3u/1/

Спасибо заранее.

+1

Слово _sometimes_ не имеет смысла в программировании ИМО .. Либо оно делает, либо нет. Причина «null» может быть введен пользователем «null» в качестве ввода в 'prompt' – Rayon

+0

@SLaks вопрос в том, почему 'null' становится строкой. – nicael

+0

Вы дважды вставили один и тот же код. Думаю, первое должно было быть без этого утверждения 'if'? – nicael

ответ

3

Вот ваш ответ

Ключевое слово «имя» вызывает проблемы при использовании в глобальной области видимости в JavaScript

Если даже в первом случае, вы замените «имя» с «имя_файла» или некоторые другое имя переменной перестанет давать нуль.

<script type="text/javascript"> 
    var fname = prompt("Enter your name:", ""); 
    if (!fname) { 
     fname = "unknown";  
    } 
    var ans =("<h2>" + "Hello, "+ fname + "!"+"</h2>");  
    document.write(ans);   
</script> 

Во втором случае переменной «имени» локально создается внутри функции и не конфликтовать с window.name. Поэтому он работает правильно

+1

@nicael Да, это и урок, который нужно изучить здесь, состоит в том, чтобы сохранить глобальные переменные до минимума. – JLRishe

+0

О, это действительно так. Простите за это! Я тупой. – nicael

-1

Один ответ на ваш вопрос заключается в том, что он возвращает null, когда пользователь ускользнул от окна приглашения, нажав кнопку отмены или нажав кнопку «Сброс».

Для дальнейшего уточнения понятий прочитать: -

Это формальный defiinition функции:

result = window.prompt(message, default); 

результат: это строка, содержащая текст, введенный пользователем, или нуль.

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

default: - строка, содержащая значение по умолчанию, отображаемое в поле ввода текста. Это необязательный параметр. Примечание, что в Internet Explorer 7 и 8, если вы не указали этот параметр, строка «undefined» является значением по умолчанию. (Выше было от Mozilla's definition of prompt())

Сейчас мы заключаем, что:

подсказка() возвращает либо нулевое или «строка», которая может включать в себя «» (пустая строка).

Теперь у нас есть три состояния, чтобы инспектировать:

неопределенные: Пользователь нажал Отмена или нажать клавишу Esc.

«» (пустая строка): Пользователь нажал кнопку ОК или нажать Enter, без ввода текста

«строка»: пользователь вошел какой-то текст.

надеюсь, что это поможет ...!

3

@RahulArora имеет в основном обеспечили правильный ответ, но, чтобы обеспечить немного больше света о том, что происходит:

Браузеры имеют встроенную глобальную переменную с именем name, который хранит имя окна , Если вы присвоите ему значение, присваиваемое значение будет преобразовано в строку. Это не имеет отношения к prompt(); Вы можете наблюдать это следующим образом:

var name = null; 
console.log(typeof name); // "string" 
console.log(name.length); // 4 

Мораль истории: Не использовать глобальные переменные, если вы абсолютно не должны, и если вы делаете, убедитесь, что они уже не используются для чего-то еще !

+0

Спасибо за дальнейшие разъяснения. Большое спасибо –

+0

@JLRishe Спасибо. Я не знал, что «имя» будет глобальной переменной. Я также не знал об этом «волшебном» обращении. – Tima

Смежные вопросы