Функции JavaScript
Под функциями в JavaScript, как и в других языках, следует понимать две возможности.
Во-первых, это встроенные в среду исполнения возможности стандартных видов обработки. Во вторых — функции, заданные пользователем. В обоих случаях синтаксис обращения к функции одинаков.
Как правило, функции получают информацию в виде одного или нескольких аргументов, но их может и не быть. Функция обрабатывает информацию и либо производит какие-то действия, либо возвращает результат своей работы, который можно оценить или поместить в переменную памяти.
Встроенные функции
....
Определение типа данных
Нередко возникает необходимость убедиться в том, что переменная (x в примерах) содержит необходимый тип данных.
Для этого есть встроенная функция typeof(), возвращающая строку с типом данных (всего их шесть).
If (typeof(x) != 'string')... //x не строка If (typeof(x) != 'boolean')... //x не логического типа If (typeof(x) != 'number')... //x не число If (typeof(x) == 'undefined')... //x вообще не существует
Функции обработки строк
Для вызова строковых функций, необходимо обратиться к конструктору String. Здесь строка — имя переменной, содержащей строку, либо непосредственно строка, заключенная в кавычки.
- String.charAt(n) — возвращает n-й символ из строки. Синтаксис: строка.charAt(n).
- String.charCodeAt(n) — возвращает код n-го символа из строки (Unicode, то есть 0–65535). Синтаксис: строка.charCodeAt(n).
- String.concat() — объединяет (конкатенирует) строки в одну. Синтаксис: строка.concat(строка1,строка2,...). В результате к концу строки будут прицеплены все аргументы, автоматически преобразуемые в строки.
- String.fromCharCode(код1, код2,...) — создает строку символов из их Unicode-кодов.
- String.length() — возвращает число символов в строке. Синтаксис: строка.length
- String.match() — ищет соответствие строки регулярному выражению. Подробнее.
- String.parseFloat() — преобразует строку в десятичную дробь.
- String.parseInt() — преобразует строку в целое десятичное число. Подробнее.
- String.replace() — заменяет подстроку в строке в соответствии с регулярным выражением. Подробнее.
- String.search() — соответствует функции match(), но возвращает номер первой подстроки, соответствующей регулярному выражению в строке, либо -1, если она не найдена.
- String.slice(start[, end]) — возвращает фрагмент строки, где start и end — начальная и конечная позиции. Если второй аргумент опущен, возвращаются символы до конца строки.
- String.split() — разбивает строку на массив, используя разделитель. Синтаксис: строка.split(разделитель[, лимит_массива]).
- String.substr() — выделяет подстроку из строки. Синтаксис: строка.substr(начало[, длина]). Если второй аргумент опущен, возвращаются символы до конца строки.
- String.substring() — почти то же, что и substr(). Здесь не обсуждается.
Функция String.match()
Переоценить эту функцию невозможно, так как в ней совмещено огромное количество поисковых возможностей. Простейший пример: соответствует ли введенный текст адресу электронной почты.
Ищет соответствие строки маске, заданной регулярным выражением.
Если соответствие не найдено, возвращается null.
Если соответствие найдено, возвращается массив, содержащий информацию о найденном соответствии.
Синтаксис:
строка.match(регулярное_выражение)
Функция String.parseInt()
Преобразует строку в целое десятичное число.
Синтаксис:
parseInt(строка[, основание])
Необязательный аргумент основания представляет собой целое число от 2 до 36 и описывает основание системы счисления в которую переводится строка. Если аргумент опущен, то число будет десятичным (не совсем так, но...). Для нас представляет интерес 16-ричная система, так как она потребуется для работы с цветом.
Если строка не может быть преобразована, то будет возвращено значение NaN.
Функция String.replace()
Одна из важнейших функций в системе безопасности.
Синтаксис:
строка.replace(регулярное_выражение, замена)
Функции обработки чисел
Здесь число — имя переменной, содержащей число, либо непосредственно число.
- isNaN(число) — возвращает true, если число не является числом или не может быть в него преобразован.
- число.toString([основание]) — преобразует десятичное число в строку. Если основание системы счисления опущено, то используется 10.
- число.toFixed(цифр) — возвращает число с определенной точностью (количеством цифр после десятичного разделителя) за счет округления.
Математические функции
Среди условно числовых функций следует особо отметить математические, служащие для выполнения стандартной обработки.
Математические функции хранятся в объекте Math. Отсюда следует, что в JavaScript для обращения к ним в начало должен добавляться префикс «Math.».
- Константы
- Math.E — константа Эйлера, основание натурального логарифма (приблизительно 2.718).
- Math.LN10 — натуральный логарифм 10 (приблизительно 2.302).
- Math.LN2 — натуральный логарифм 2 (приблизительно 0.693).
- Math.LOG10E — логарифм e по основанию 10 (приблизительно 0.434).
- Math.LOG2E — логарифм e по основанию 2 (приблизительно 1.442).
- Math.PI — число Пи (π = 3.14159).
- Math.SQRT1_2 — квадратный корень из 1/2 (приблизительно 0.707).
- Math.SQRT2 — квадратный корень из 2 (приблизительно 1.414).
- Функции (возвращают)
- Math.abs(число) — абсолютное значение числа.
- Math.acos(число) — арккосинус угла в радианах.
Примечание. Для перевода градусов в радианы умножьте число на 2π/360. - Math.asin(число) — арксинус угла в радианах.
- Math.atan(число) — арктангенс угла в радианах.
- Math.atan2(x, y) — угол наклона прямой от точки начала координат к точке с указанными координатами к оси абсцисс.
- Math.ceil(число) — Округляет число до ближайшего целого, большего по абсолютному значению или равного ему.
- Math.cos(число) — косинус угла в радианах.
- Math.exp(x) — экспоненту (ex).
- Math.floor(число) — целое число с отброшенной дробной частью. Отрицательные числа округляются до ближайшего меньшего или равного целого!
- Math.log(число) — натуральный логарифм числа.
- Math.max(число1, число2...) — наибольшее из перечня чисел.
- Math.min(число1, число2...) — наименьшее из перечня чисел.
- Math.pow(x, y) — число x в степени y. (Не надо возводить в степень гугол: получите Infinity.)
Math.pow(x, 1/3) извлечет кубический корень,
Math.pow(x, 1/4) извлечет корень четвертой степени и т.д. - Math.random(число) — псевдослучайное число в диапазоне от 0 до 1.0.
- Math.round(число) — число, округленное до ближайшего целого.
- Math.sin(число) — синус угла в радианах.
- Math.sqrt(число) — извлеченный квадратный корень.
- Math.tan(число) — тангенс угла в радианах.
Функции обработки дат и времени
Функция Date() возвращяет сегодняшнюю дату (точнее дату, установленную на компьютере).
today = new Date(); document.write('Сегодня: ' + today.toLocaleDateString());
Можно создать дату, используя конкретные числовые значения её элементов (г,м,д).
var d = new Date(2006, 8, 21);
Нередко из даты надо «выковырять» год, месяц, день, день недели.
d.getFullYear() //Год в 4-значном формате d.getMonth() //Номер месяца от 0 до 11 d.getDay() //День недели от 0 (вс.) до 6 (сб.) d.getHours() //Час от 0 до 23 ... d.getTime() //Переводит дату в миллисекунды, например, для сравнения дат d.setTime() //Переводит миллисекунды в дату
Функции обработки массивов
Массив можно создать несколькими способами:
var a = new Array() //Создание пустого массива a var a = new Array(10) //Создание массива a с 10 элементами (0-9) var b = [1, 'two', false] //Создание массива b из 3 элементов разного типа
Подробнее о массивах см. здесь.
Функции, задаваемые пользователем
Пользовательские функции, помещаемые не в тело документа, а в отдельный файл, должны содержать только текст на JavaScript.
Крайне важно, что функция исполняется в собственной локальной области памяти. Отсюда следует, что нам не о чем беспокоится, если мы не забудем объявлять все переменные инструкцией var.
Прежде чем создать свою функцию, нужно следующее.
- Понять, что она нужна! Эта проблема наиболее значима для начинающего программиста. Только определенный опыт позволяет вовремя понять, что программировать задачу надо в виде функции, так как она будет использоваться много раз. Возможно, что её придется выполнять со множеством условий (передавая ей соответствующие аргументы).
- Принять решение о том, где она будет размещаться: в HTML-документе, текущей папке, специальной папке, в файле личной библиотеки самых нужных на свете программ.
- Продумать как, для чего и почему может развиваться ваша идея.
- Разработать алгоритм работы программы и реализовать его в виде кода.
Создание функции
Теперь практическая сторона.
- Первая строка содержит слово function.
- После него через пробел указывается имя функции (соответствующее правилам и здравому смыслу)
- Затем — пара круглых скобок.
- Если функции передаются значения, то в скобках надо перечислить через запятую имена аргументов, которые будет использовать функция, чтобы различать значения.
- Далее, в фигурных скобках вводится программный код, являющийся собственно функцией.
- Результатом работы функции часто будет некое возвращаемое значение.
Аргументы
Если функции передаются аргументы, то их имена или значения записываются в скобках.
Обращение к функции (её вызов) с аргументами:
x = my_func(a,b) //функции переданы значения переменных a и b x = my_func(10,20) //функции переданы два конкретных числа //В обоих случаях результа будет запомнен в переменной x
Сама функция, например, вернет произведение аргументов:
function my_func(m,n) { return m*n; }
Если в предыдущем случае аргументы представляли собой новые переменные m и n, то в следующем примере они названы также — a и b.
function my_func(a,b) { return a*b; }
Хочется напомнить и заострить внимание на том, что при выполнении функции будут сознаны новые (локальные) переменные a и b, то есть одновременно будут существовать a глобальная и a локальная. Последняя будет удалена из памяти после выполнения кода функции и её изменение никак не отразиться на глобальной «тезке».
Но что же будет, если забыть передать функции аргументы [my_func()] или передать только один [my_func(a)]?
Ответ прост: возникнет ошибка и программа работать не будет.
Но может быть еще хуже: функция вернет принципиально неправильный результат.
Для того, чтобы подобных неприятностей не возникало, требуется дополнительный анализ аргументов на факт их наличия и тип переданных данных.
При этом необходимо дополнительно учитывать, что аргументы подразделяются на обязательные и необязательные. Чтобы облегчить работу с ними, обязательные аргументы обычно приводят вначале, а необязательные — в конце.
При вызове функции создается объект arguments, отчасти похожий на массив, в связи с чем он имеет длину, то есть количество переданных аргументов (arguments.length). К элементам массива аргументов можно обратится по номеру: arguments[0] вернет значение первого аргумента, arguments[1] — втотого...
function my_func(a,b) { if (arguments.length==0){document.write('Ошибка!');return false;} //Раз аргументов нет, то и работать функция не сможет //В данном случае она выведет в документ слово Ошибка! и возвратит ложь //это должно быть корректно обработано в самой программе if (arguments.length==1){b=10;} //Второго аргумента нет //Решаем, что он не является обязательным и присваиваем b значение 10 return a*b; }
Да, но при использовании функции можно вместо числа передать любую белиберду.
function my_func(a,b) {
if (arguments.length==0){document.write('Ошибка!');return false;}
if (typeof(a) != 'number') {а=1};
//Если передан не числовой тип, то присвоим переменной единицу
if (arguments.length==1){b=10;}
return a*b;
}
Не очень умный вариант, так как функция без аргументов всегда вернет 1*10, но это только иллюстрирует другую возможность. Кроме того, нет проверки второго аргумента.
Изменим функцию, задав составное условие через логический оператор ИЛИ (||).
function my_func(a,b) { if (arguments.length==1){b=10;} if ((arguments.length==0) || typeof(a) != 'number') || typeof(b) != 'number')) { document.write('Ошибка!'); return 'Ошибка!'; } return a*b; }
Передав больше, чем 2 аргумента, мы ничего не добьемся, но и ничего не испортим, так как они не обрабатываются. Только сама функция перестанет работать, так как должна получать не более двух аргументов.
Возвращаемое значение
Функция может что-то делать (например, выводить на экран), но, в данном случае, речь идет о функции, обрабатывающей данные и возвращающей результат.
Наиболее правильным следует признать использование команды return, после которой записывается возвращаемое значение.
if (x==0) {return true;} //Если x = 0, возвратить истину, else {return false;} //иначе — ложь return x; //Возвратить значение переменной x
Пример разработки функции
Очень часто в нашей жизни происходит так называемое изобретение велосипеда. Это случается, когда мы не знаем, что это уже придумано и пытаемся сделать сами. Подобная работа крайне обидна, но очень помогает как развитию аналитических способностей, так и возникновению открытий: не факт, что до вас придумали идеально.
В нашем примере мы попробуем пройти наоборот — от знания к изобретательству. Попробуем написать функцию возведения числа в степень.
Тот кто занимался внимательно помнит, что для возведения числа в степень используется символ крышки (^). Тогда нечего и выдумывать: x^y и всё! Но в JavaScript этот символ имеет совершенно другой смысл, а для возведения в степень используется функция Math.pow().
Вроде и мудрить нечего, зато можно легко разобраться с формированием функции и использованием некоторых конструкций языка. Итак.
Проблема заключается в том, что квадрат и куб достаточно легко записать через умножение: x*x, x*x*x. Если же степень возрастает или не является целым числом (нам это пригодится), то в подобной записи могут легко возникнуть ошибки.
Для начала придумаем функции название. Самое разумное — использовать английские слова, заодно подтянув знания в этом языке. Степень по английски — degree.
Чтобы она работала, ей придется передать два числовых аргумента: основание и степень. Назовем их x и y. В функции нужно x умножить на себя y раз. Теперь можно составить программу.
function degree(x,y) {
//Функция возведения в степень
return Math.pow(x,y);
}
Готово! Если функция располагается в HTML-файле, её осталось вставить в контейнер <script>.
Для обращения к функции всегда будет использоваться один и тот же синтаксис. Например, нужно возвести значение переменной a в степень b и сохранить его в переменной c:
c = degree(a, b);
Замечание: функция должна быть описана в текущем файле, либо загружена в него.
Только смысла в нашей программе немного. Проще было использовать сразу встроенную функцию. Пропробуем сделать это вручную, назвав функцию degree1 и воспользовавшись предыдущими рассуждениями.
Итак, возьмем x и будем его умножать на себя же y раз. Мы уже неоднократно обсуждали цикл повторения, так что пока говорить не о чем. Постойте, а где хранить промежуточный результат? Естественно в переменной. Для этого воспользуемся именем degree1 (почему нет?).
function degree1(x,y) { var degree1 = x; for (i=2; i<=y; i++){ degree1 = degree1 * x } return degree1;}
(Числа берутся из предыдущей формы.)
Для тех, кто дошел до этого места, можно предложить найти ошибки и противоречия в функции degree1.