2012-01-17 3 views
0

Я не думаю, что я полностью понимаю, как это работает (я немного смущен ... немного я имею в виду много). В основном это должно создать подсказку и написать console.log fullName с первыми двумя буквами в каждом приглашении, которые должны быть капитализированы и объединены вместе. Пожалуйста помоги!Попытка понять эту короткую функцию

var fullName = ""; 
//Why does fullName have to be defined as a string? and when it's removed it doubles the value? 

var name; 
var firstLetter; 

var fixName = function() { 
    firstLetter = name.substring(0, 1); 
    name = firstLetter.toUpperCase() + name.substring(1); 

    fullName = fullName + " " + name; 
    //what exactly is happening here under the fullName variable? What value is passing into fullName after it's being called? 
} 

name = prompt("Enter your first name (all in lower case):"); 

fixName(); 

name = prompt("Enter your second name (all in lower case):"); 

fixName(); 

console.log("And your fullname is:" + fullName); 
+3

Just FYI: Это очень страшный способ сделать это. :) – deceze

+1

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

+0

О, я знаю ха-ха ... но это для классов Codecademy, которые онлайн. К сожалению, это единственный сайт, который я знаю об этом. Что еще более важно для меня прямо сейчас - это понять, почему это работает так, как это происходит? haha – Dandy

ответ

2

Вот аннотированный версия функции:

var fixName = function() { 
    // get the first letter of the string 
    firstLetter = name.substring(0, 1); 

    // assign back to name the uppercased version of the first letter 
    // with the rest of the name 
    name = firstLetter.toUpperCase() + name.substring(1); 

    // add name onto the end of fullName 
    // this will accumulate each time this function is called because 
    // fullname is a global variable so it will get longer and longer each time 
    // with more and more names in it 
    fullName = fullName + " " + name; 
} 

FYI, это довольно ужасный код в целом. Следует с использованием по меньшей мере, некоторые локальные переменные и аргумент функции так:

var fullName = ""; 

function fixName(name) { 
    var firstLetter = name.substring(0, 1); 
    fullName = fullName + " " + firstLetter.toUpperCase() + name.substring(1); 
} 

fixName(prompt("Enter your first name (all in lower case):")); 
fixName(prompt("Enter your second name (all in lower case):")); 
console.log("And your fullname is:" + fullName); 

Это, вероятно, не следует модифицировать глобальную переменную в качестве побочного эффекта либо (вероятно, должно использовать возвращаемое значение), но я Didn Не измените это.

+1

Вау ... Не могу поверить, что я этого не видел. fullName добавляет пустую переменную и пробел до того, как получит значение, заполненное ... и затем повторится. Это действительно ужасный код! Я делаю все возможное и довольно активно изучал этот язык, но я чувствую, что не буду лучше, если упражнения, которые я нахожу, сломаны/устарели/или вообще плохи. – Dandy

+0

Я очень ценю быстрый ответ. Это быстро становится моим новым любимым сайтом! – Dandy

0

fullName ли первая определяется как пустая строка, в которой name получает сцепляются раз name был изменен, чтобы его первая буква в верхнем регистре.

При каждом вызове prompt возвращаемое значение сохраняется в name, что также является глобальной переменной. Это значение name заменено на соответствующий корпус внутри fixName().

Поскольку функция fixName() вызывается дважды и fullName объявляется в глобальном масштабе, выход fixName() добавляется к переменной fullName оба раза. Кулак для имени, а второй - фамилия (второе имя). В конце концов, fullName должен содержать Firstname Lastname (с дополнительным пространством в начале).

0

Код является уродливым, используя так называемые «побочные эффекты», работающие с глобальными переменными, без параметров функции или результата функции. Он заполняет fullName пробелом, заглавным именем, пробелом, заглавным вторым именем.

Использование следующего параметра сделает глобальные переменные ненужными.

function capitalized(s) { 
    if (s == "") return ""; 
    return s.substring(0, 1).toUpperCase() + s.substring(1); 
} 
0

Чтобы адаптировать исходный код:

window.onload = function(){ 
    var names = {}, result = ''; 
    function fixName(input){ 
     return input.substr(0, 2).toUpperCase() 
    } 
    names.first = window.prompt("What is your first name?") 
    names.last = window.prompt("What is your last name?") 

    for(var n in names){ 
     var nameValue = names[n]; 
     result += fixName(nameValue) 
    } 
    console.log(result) 
} 

Есть гораздо более эффективные способы, как другие будут иллюстрирующих, но это основано на том, что вы написали. Happy Javascripting :)

+0

FYI, нет гарантированного заказа при итерации свойств объекта, подобного этому 'for (var n в именах)', поэтому это не гарантируется, чтобы получить имя до фамилии. – jfriend00

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