<b> input: null, // Поле, куда пользователь вводит-числа.</b>
<b> low: null, // Три ячейки таблицы для визуального представления</b>
<b> mid: null, // ...диапазона, в котором находится загаданное число.</b>
<b> high: null</b>
<b> };</b>
<b> // Отыскать каждый из этих элементов по их атрибутам id</b>
<b> for(var id in ui) ui[id] = document.getElementByld(id):</b>
<b> // Определить обработчик событий для поля ввода</b>
<b> ui.input.onchange = handleGuess;</b>
<b> // Выбрать случайное число и инициализировать состояние игры</b>
<b> state = {</b>
<b> n: Math.floor(99 * Math.random()) + 1, // Целое число: 0 < n < 100</b>
<b> low: 0, // Нижняя граница, где находится угадываемое число</b>
<b> high: 100, // Верхняя граница, где находится угадываемое число</b>
<b> guessnum: 0, // Количество выполненных попыток угадать число</b>
<b> guess: undefined // Последнее число, указанное пользователем</b>
<b> };</b>
<b> // Изменить содержимое документа, чтобы отобразить начальное состояние</b>
<b> display(state):</b>
<b> // Эта функция вызывается как обработчик события onload, а также как обработчик щелчка</b>
<b> // на кнопке Play Again (Играть еще раз), которая появляется в конце игры.</b>
<b> // Во втором случае аргумент playagain будет иметь значение true, и если это так,</b>
<b> // мы сохраняем новое состояние игры. Но если функция была вызвана в ответ</b>
<b> // на событие "load", сохранять состояние не требуется, потому что событие "load"</b>
<b> // может возникнуть также при переходе назад по истории посещений из какого-то</b>
<b> // другого документа в существующее состояние игры. Если бы мы сохраняли начальное</b>
<b> // состояние, в этом случае мы могли бы затереть имеющееся в истории актуальное</b>
<b> // состояние игры. В броузерах, поддерживающих метод pushState(), за событием "load"</b>
<b> // всегда следует событие "popstate". Поэтому, вместо того чтобы сохранять</b>
<b> // состояние здесь, мы ждем событие "popstate". Если вместе с ним будет получен</b>
<b> // объект состояния, мы просто используем его. Иначе, если событие "popstate"</b>
<b> // содержит в поле state значение null, мы знаем, что была начата новая игра,</b>
<b> // и поэтому используем replaceState для сохранения нового состояния игры,</b>
<b> if (playagain === true) save(state);</b>
<b>}</b>
<b>// Сохраняет состояние игры с помощью метода pushStateO, если поддерживается</b>
<b>function save(state) {</b>
<b> if (!history.pushState) return;// Вернуться, если pushState() не определен</b>
<b> // С каждым состоянием мы связываем определенную строку URL-адреса.</b>
<b> // Этот адрес отображает число попыток, но не содержит информации о состоянии игры,</b>
<b> // поэтому его нельзя использовать для создания закладок.</b>
<b> // Мы не можем поместить информацию о состоянии в URL-адрес,</b>
<b> // потому что при этом пришлось бы указать в нем угадываемое число,</b>
<b> var url = "#guess" + state.guessnum;</b>
<b> // Сохранить объект с информацией о состоянии и строку URL</b>
<b> history.pushState(state, // Сохраняемый объект с информацией о состоянии</b>
<b> "", // Заглавие: текущие броузеры игнорируют его</b>
<b> url); // URL состояния: бесполезен для закладок</b>
<b>}</b>
<b>// Обработчик события onpopstate, восстанавливающий состояние приложения,</b>
<b>function popState(event) { </b>
<b> if (event.state) { // Если имеется объект состояния, восстановить его</b>
<b> // Обратите внимание, что event.state является полной копией</b>
<b> // сохраненного объекта состояния, поэтому мы можем изменять его, </b>
<b> // не опасаясь изменить сохраненное значение. </b>
<b> state = event.state; // Восстановить состояние </b>
<b> displayCstate); // Отобразить восстановленное состояние </b>
<b> }</b>
<b> else { </b>
<b> // Когда страница загружается впервые, событие "popstate" поступает</b>
<b> // без объекта состояния. Заменить значение null действительным</b>