Есть много удобных и хорошо продуманных языков. Сюда можно отнести C, Python, Java и т.д. Сразу оговорюсь, идеальных нет.
Есть языки интересные, эклектичные, рождённые в муках безысходности. Это Perl, Bash, JavaScript. Именно о последнем мы сегодня и поговорим.
В 1992-ом ребята из Nombas разработали концепт — язык программирования Cmm — C-минус-минус. Отсутствие необходимости управлять вручную памятью, встраиваемость в браузеры (Netscape 16 бит под Windows). Это было весело, здорово… но всего лишь концепт.
Не прошло и 3-х лет, как в 1995-ом ребята из Netscape осознали, что было бы неплохо добавить язык программирования в браузер, чтобы он позволял «склеивать» плагины, Java-апплеты и прочие ресурсы страниц.
Историю того, что JavaScript так называется, отчего пригорает у многих HR-ов («А что, и там и там Java»), можно свести к одному слову. Хайп. Java тогда была популярна. Такие дела.
В итоге — в лучших традициях IT был «изобретён» такой язык в самые сжатые сроки. В ответ Netscape ребята из Microsoft (а они были основными конкурентами на браузерном рынке) создали свою реализацию — JScript.
Далее — времена тяжкой стандартизации: ECMAScript — так называется стандарт языка. За долгое время эволюций язык претерпел (и продолжает претерпевать) много изменений. Сегодня мы рассмотрим базовые возможности ECMAScript 5.
Для начала нам потребуется в инструментах разработчика открыть вкладку «Console»:
Переменные в JavaScript
Что бы мы не делали: складывали числа, изменяли строки — в любом случае нам было бы неплохо всё это куда-то складывать. Именно про это и переменные.
Объявление (создание) переменных JavaScript
Создание переменных в JavaScript более часто называют «объявлением» переменных.
Создать переменную можно с помощью ключевого слова var:
var year; console.log("Год", year);
А посмотреть, что же внутри переменной — с помощью console.log.
После объявления переменные пусты — «undefined» — не определена.
А можно и сразу присвоить какое-то значение:
С числами всё более-менее ясно. Со строками — не забудьте заключить их в кавычки.
Локальные переменные JavaScript
Переменная, объявленная внутри функции JavaScript становится локальной и будет доступна только в пределах этой функции. (переменная имеет локальную область видимости).
Вы можете объявлять локальные переменные с одним и тем же именем в различных функциях, потому что локальные переменные распознаются в функции, в которой они объявлены.
Локальные переменные уничтожаются при выходе из функции.
var a = 12; function localVar () { var a = 42; console.log('В localVar a=42', a); } localVar(); console.log("Глобально переменная всё равно a=12", a);
С функциями мы познакомимся в этом же уроке, чуть ниже.
Глобальные переменные JavaScript
Переменные, объявленные вне функции становятся глобальными, и все скрипты и функции на странице могут к ним обращаться.
Глобальные переменные уничтожаются когда вы закрываете страницу.
Если вы объявляете переменную, не используя «var», переменная всегда становится глобальной.
О вреде глобальных переменных мы поговорим позже. Но поверьте, слишком много времени потрачено на отладку программ, использующих глобальные переменные.
Функции в JavaScript
Часто бывает, что можно в программе выделить какую-то часть, которая логически выделяется. Например, если мы хотим сделать несколько записей на нашей странице, то сделаем функцию, которая будет выводить html, который мы вставим в страничку.
function note (userName, text) { return '<div>' + userName + ' пишет:</div>' + '<p>' + text + '</p>'; }
Как можно видеть,
- функция определяется ключевым словом function,
- дальше идёт название функции («note»),
- в скобках перечисляются параметры функции — то, что будет ей передано для обработки,
- тело функции — обычный JavaScript код, заключённый в фигурные скобки,
- функция заканчивает свою работу по слову return, возвращая значение, переданное return.
Логические условия и циклы
Часто бывает, что нам нужно не просто написать рецепт:
- возьмите кастрюлю,
- добавьте литр воды,
- доведите до кипения
— кипяток готов!
Часто порядок действий зависит от каких-то условий. Давайте напишем функцию, которая возвращает человеко-читаемое сообщение о количестве комментариев:
function commentCountText(count) { if (count < 0) { return "Ошибка - отрицательное количество комментариев"; } if (count == 0) { return "Ни одного комментария"; } if (count % 10 == 1) { return count + " комментарий"; } if (count % 10 < 5) { return count + " комментария"; } return count + " комментариев"; }
Если count < 0 — то что-то пошло не так. Если 0 — то пишем, что комментариев нет. Если остаток от деления (этот самый процент) на 10 равен 1, то одно и т. д.
Кстати, поэкспериментируйте с остатком от деления — это неплохой инструмент, когда надо выводить в шаблонизаторах таблицы и прочие повторяющиеся штуки.
Циклы в JavaScript
Логические ветвления — это хорошо. А что, если нам надо сделать что-то повторяющееся? Например, проверить, что наша функция для вывода текста «столько-то комментариев», работает нормально для первых 10-ти. Можно руками написать 10 вызовов, а можно сделать это в цикле!
for (var i = 1; i <= 10; i = i + 1) { commentCountText(i); }
Мы увидим результаты 10-ти вызовов commentCountText с параметрами от 1 до 10. Как же это получилось? Используем ключевое слово for, в скобочках 3 действия, разделённых «;». Разберём от первого к последнему:
var i = 1
— до начала цикла объявимi = 1
;i <= 10
— условие работы цикла — «продолжаем, пока i меньше или равно 10»;i = i + 1
— каждый раз, когда заканчивается цикл, делаем это действие — увеличиваем i на 1 (также это можно было сделать операциейi++
).
В фигурных скобках — блок действий, которые будут выполняться раз за разом в цикле.
Это стандартный цикл в стиле языка C. Есть ещё пара типов цикла for. Он довольно полезный в некоторых ситуациях. Давайте объявим массив (коллекция подряд идущих элементов) чисел:
var numList = [1, 3, 4, 5, 9];
И с помощью операции for of проверим их на чётность:
for (var num of numList) { if (num % 2 == 1) { console.log(num, "- число нечётное"); } else { console.log(num, "- число чётное"); } }
Условие if
— мы уже знаем. А вот конструкцию else
— ещё нет. Это необязательная часть условного оператора if-else
. Блок кода, который идёт в фигурных скобках после if
, выполняется в случае, когда условие истинно. Блок else
— выполняется, когда условие оказалось ложным. Думаю, из примера это уже стало ясно, но я уточнил.
for of
работает как «перебор» от первого элемента коллекции к последнему. Так мы пройдёмся по всем элементам из numList (1, 3, 4 и т.д.) по одному и для каждого из них (будет лежать в переменной num) мы выполним блок операций цикла — пройдёмся по всем и скажем — а чётное число или нет.
Задание
Напишите функцию, выводящую список комментариев пользователей. Параметр функции — список комментариев. Например:
var comments = ['Первый тут', 'Я ничего не понял', 'Когда уже начнём писать вконтактик?']; printComments(comments);
Вывод:
<div>Первый тут</div> <div>Я ничего не понял</div> <div>Когда уже начнём писать вконтактик?</div>
Доп. задание
Добавьте в функцию ещё один параметр — reverse, если туда передаётся 0, то функция работает, как описано выше. Если туда передано какое-то другое число — порядок вывода комментариев меняется на противоположный. Например:
var comments = ['Первый тут', 'Я ничего не понял', 'Когда уже начнём писать вконтактик?']; printComments(comments, 1);
Вывод:
<div>Когда уже начнём писать вконтактик?</div> <div>Я ничего не понял</div> <div>Первый тут</div>
— в стиле блога (новые сверху).