Это потому, что при создании строки, например:
" (" + questions + " questions left)"
строка будет иметь нет зависимость от содержащейся в ней переменной.
Значение переменной подставляется во время создания строки.
Чтобы обойти это, можно отложить подстановку до тех пор, пока она действительно не понадобится (но это может вызвать повторяющиеся строки):
var questions = 3;
var adjective = prompt('Please type an adjective (' + questions + " questions left)");
questions -= 1;
var verb = prompt('Please type a verb (' + questions + " questions left)");
questions -= 1;
var noun = prompt('Please type a noun (' + questions + " questions left)");
alert('All done. Ready for the message?');
var sentence = "<h2>There once was a " + adjective;
sentence += ' programmer who wanted to use JavaScript to ' + verb;
sentence += ' the ' + noun + '.</h2>';
document.write(sentence);
Кроме того, вы можете сделать что-нибудь приятное с литералами шаблона с тегами ES6:
const templateCreator = (strings, ...indices) => (...substitutions) => strings.slice(1).reduce((acc, string, index) => acc + substitutions[indices[index]] + string, strings[0])
var questions = 3;
var templateFunction = templateCreator `Please type a${0} (${1} questions left)`
var adjective = prompt(templateFunction('n adjective', questions));
questions -= 1;
var verb = prompt(templateFunction(' verb', questions));
questions -= 1;
var noun = prompt(templateFunction(' noun', questions));
alert('All done. Ready for the message?');
var sentence = "<h2>There once was a " + adjective;
sentence += ' programmer who wanted to use JavaScript to ' + verb;
sentence += ' the ' + noun + '.</h2>';
document.write(sentence);
Используя вышеуказанное решение, вы можете использовать шаблон многократного использования в виде функции, которую можно вызывать столько раз, сколько вы хотите, с разными аргументами.
Для этого и используются литералы шаблона.
Но учтите, что мы по-прежнему передаем переменную questions
в каждом вызове templateFunction
.
Наконец, мы может go сделать еще один шаг и создать еще одну функцию, которая обернет templateFunction
и в качестве переменной будет иметь переменную questions
:
const templateCreator = (strings, ...indices) => (...substitutions) => strings.slice(1).reduce((acc, string, index) => acc + substitutions[indices[index]] + string, strings[0])
var questions = 3;
var templateFunction = wordClass => (templateCreator `Please type a${0} (${1} questions left)`)(wordClass, questions)
var adjective = prompt(templateFunction('n adjective'));
questions -= 1;
var verb = prompt(templateFunction(' verb'));
questions -= 1;
var noun = prompt(templateFunction(' noun'));
alert('All done. Ready for the message?');
var sentence = "<h2>There once was a " + adjective;
sentence += ' programmer who wanted to use JavaScript to ' + verb;
sentence += ' the ' + noun + '.</h2>';
document.write(sentence);