Клиентский JavaScript. Руководство по Использованию
Глава 6
Функции
Функции это фундаментальные конструкции JavaScript. Функция это процедура JavaScript - набор операторов, выполняющих специфическую задачу. Для использования функции Вы обязаны сначала определить ее; затем Ваш скрипт может ее вызвать.
В главе имеются следующие разделы:
Определение функций
Определение функции состоит из ключевого слова function
и:
- имени функции
- списка аргументов, заключенных в скобки и разделенных запятыми
- операторов JavaScript, определяющих функцию, заключенных в фигурные скобки { }. Операторы функции могут содержать вызовы других функций, определенных в текущем приложении.
Вы должны определять все Ваши функции в HEAD/шапке страницы, чтобы при ее загрузке пользователем функции загружались в первую очередь. Иначе пользователь может выполнить действие, когда страница еще загружается, и включить обработчик и вызвать функцию, которая еще не определена, что приведет к возникновению ошибки.
Например, следующий код определяет простую функцию square
:
function square(number) {
return number * number;
}
Функция square
принимает один аргумент number
.
Эта функция состоит из одного оператора, указывающего возвращаемое значение -
аргумент функции, умноженный сам на себя. Оператор return
специфицирует
значение, возвращаемое функцией.
return number * number
Все параметры передаются функциям по значению; значение передается функции, но если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаете функции объект в качестве параметра и функция изменяет свойства объекта, это изменение видно́ вне функции, как показано в примере:
function myFunc(theObject) {
theObject.make="Toyota"
}
mycar = {make:"Honda", model:"Accord", year:1998}
x=mycar.make // возвращает Honda
myFunc(mycar) // передает объект mycar функции
y=mycar.make // возвращает Toyota (prop было изменено функцией)
Помимо описанного здесь определения функции, Вы можете также определять объекты Function
,
как показано в разделе "Объект Function".
Метод это функция, ассоциированная с объектом. Вы может узнать больше об объектах и методах в Главе 7 "Работа с Объектами".
Вызов функций
В приложениях для Navigator'а Вы можете использовать (или вызывать) любую функцию, определенную на текущей странице. Вы можете также использовать функции, определенные другими именованными окнами или фрэймами.
Определение функции не вызывает ее выполнения. Определение функции просто
именует функцию и специфицирует, что́ выполняется при вызове функции. Вызов функции реально
выполняет специфицированные акции с указанными параметрами. Например, если Вы
определили функцию square
, Вы можете вызвать ее так:
square(5)
Это оператор вызова функции с аргументом 5. Функция выполняет свои операторы и возвращает значение 25.
Аргументы функции не ограничиваются только числами и строками. Вы можете
также передавать в функцию объекты. Функция show_props
(определенная
в разделе "Объекты и Свойства")
это пример функции, принимающей в качестве аргумента объект.
Функция может быть рекурсивной, то есть вызывать сама себя. Например, вот функция вычисления факториалов:
function factorial(n) {
if ((n == 0) || (n == 1))
return 1
else {
result = (n * factorial(n-1) )
return result
}
}
Вы можете вычислить факториалы значений от 1 до 5:
a=factorial(1) // возвращает 1
b=factorial(2) // возвращает 2
c=factorial(3) // возвращает 6
d=factorial(4) // возвращает 24
e=factorial(5) // возвращает 120
Использование массива arguments
Аргументы обрабатываются в массиве. В функции Вы можете адресовать параметры, передаваемые ей:
arguments[i]
functionName.arguments[i]
где i
это порядковый номер аргумента, начиная с 0.
Таким образом, первый аргумент, передаваемый функции, это arguments[0]
.
Общее число аргументов указывается свойством arguments.length
.
Используя массив arguments
, Вы можете вызвать функцию с большим
количеством аргументов, чем объявлено в формальном определении. Это часто
используется, если заранее не известно точное количество аргументов,
передаваемых функции. Вы можете использовать arguments.length
для
определения количества аргументов, реально передаваемых функции, а затем
работать с каждым аргументом с использованием массива
arguments
.
Например, рассмотрим функцию, которая объединяет несколько строк. Единственным формальным аргументом для этой функции является строка, которая специфицирует символы, разделяющие объединяемые элементы. Функция определена так:
function myConcat(separator) {
result="" // инициализирует список
// итерирует по аргументам
for (var i=1; i<arguments.length; i++) {
result += arguments[i] + separator
}
return result
}
Вы можете передать этой функции любое количество аргументов, и она создаст список, используя каждый аргумент как элемент списка.
// возвращает "red, orange, blue, "
myConcat(", ","red","orange","blue")
// возвращает "elephant; giraffe; lion; cheetah;"
myConcat("; ","elephant","giraffe","lion", "cheetah")
// возвращает "sage. basil. oregano. pepper. parsley. "
myConcat(". ","sage","basil","oregano", "pepper", "parsley")
См. статью об объекте Function
в книге
Клиентский JavaScript.
Справочник.
Предопределенные функции
В JavaScript есть несколько предопределенных функций:
В следующих разделах рассматриваются эти функции. См. также книгу Клиентский JavaScript. Справочник.
Функция eval
Функция eval
вычисляет строку кода JavaScript без ссылки на
определенный объект. Синтаксис eval
таков:
eval(expr)
где expr
это вычисляемая строка.
Если строка представляет выражение, eval
вычисляет это выражение.
Если аргумент представляет собой один или несколько операторов JavaScript, eval
выполняет эти операторы. Не вызывайте eval
для вычисления
арифметических выражений; JavaScript вычисляет арифметические выражения
автоматически.
Функция isFinite
Функция isFinite вычисляет аргумент, чтобы определить,
является ли он конечным числом. Синтаксис isFinite
:
isFinite(number)
где number
это вычисляемое число.
Если аргумент имеет значения NaN
, положительная или отрицательная
бесконечность, то этот метод возвращает false
, иначе возвращает true
.
Следующий код проверяет клиентский ввод и определяет, является ли он конечным числом.
if(isFinite(ClientInput) == true)
{
/* некоторые специальные шаги */
}
Функция isNaN
Функция isNaN
вычисляет аргумент, чтобы определить, является ли он "NaN" (не-числом).
Синтаксис isNaN
:
isNaN(testValue)
где testValue
это значение, которое Вы
хотите обсчитать.
Функции parseFloat
и parseInt
возвращают "NaN", если они вычисляют значение, которое не является числом. isNaN
возвращает true, если передано "NaN", и false - в ином случае.
Следующий код вычисляет floatValue
и определяет, является ли оно
числом, а затем вызывает соответствующую процедуру:
floatValue=parseFloat(toFloat)
if (isNaN(floatValue)) {
notFloat()
} else {
isFloat()
}
Функции parseInt и parseFloat
Две "parse"-функции, parseInt
и parseFloat
, возвращают
числовое значение при получении строкового аргумента.
parseFloat(str)
где parseFloat
разбирает свой аргумент,
строку str
, и пытается возвратить число с плавающей точкой. Если
она обнаруживает символ, отличный от знака (+ или -), числа (0-9), десятичной
точки или экспоненты, она возвращает значение, разобранное до этого места, и игнорирует этот символ и
все последующие символы. Если первый символ не может быть конвертирован в число,
функция возвращает значение "NaN" (не-число).
parseInt(str [, radix])
parseInt
разбирает первый аргумент, строку str
,
и пытается возвратить целое число со специфицированной radix
(базой),
обозначаемой вторым не обязательным аргументом radix
. Например, radix
10 указывает на конвертацию десятеричного числа, 8 -восьмеричного, 16 -
шестнадцатеричного, и так далее. При radix более 10 буквы латинского алфавита
используются для обозначения цифр больше 9. Например, для 16-ричных чисел (база 16),
используются английские буквы от A до F.
Если parseInt
обнаруживает символ, не являющийся цифрой в
специфицированном radix, она игнорирует этот и все последующие символы и возвращает целочисленное
значение, разобранное до этого места.
Если первый символ не может быть конвертирован в число со специфицированной базой, функция возвращает "NaN."
Функция parseInt
усекает строку до целочисленных значений.
Функции Number и String
Функции Number
и String
позволяют конвертировать
объект в число или строку. Синтаксис таков:
Number(objRef)
String(objRef)
где objRef
это ссылка на объект.
В следующем примере Date
-объект конвертируется в читабельную строку.
D = new Date (430054663215)
// возвращает
// "Thu Aug 18 04:37:43 GMT-0700 (Pacific Daylight Time) 1983"
x = String(D)
Функции escape и unescape
Функции escape
и unescape
позволяют кодировать и
декодировать строки. Функция escape
возвращает 16-ричное кодовое значение
своего аргумента -
символа их набора ISO Latin. Функция unescape
возвращает ASCII-строку
для специфицированного 16-ричного кодового значения.
escape(string)
unescape(string)
Эти функции используются в основном в серверном JavaScript для кодирования и декодирования пар имя/значение в URL.