Определяют функцию при помощи ключевого слова function:
function f(arg1,arg2,...){/* тело функции */}
Здесь следует обратить внимание на следующие моменты. Во-первых, functionопределяет переменную с именем f. Эта переменная имеет тип function:
document.write('Тип переменной f: '+ typeof(f));// Будет выведено: Тип переменной f: function
Во-вторых, эта переменная, как и любая другая, имеет значение - свой исходный текст:
var i=5; function f(a,b,c){ if (a>b) return c;} document.write('Значение переменной i: '+ i.valueOf()); // Будет выведено:// Значение переменной i: 5 document.write('Значение переменной f:<BR>'+ f.valueOf()); // Будет выведено:// Значение переменной f:// function f(a,b,c)// {// if (a>b) return c;// }
Как видим, метод valueOf() применим как к числовой переменной i, так и к переменной f, и возвращает их значение. Более того, значение переменной fможно присвоить другой переменной, тем самым создав "синоним" функции f:
function f(a,b,c){ if (a>b) return c; else return c+8;} var g = f;alert('Значение f(2,3,2): '+ f(2,3,2) );alert('Значение g(2,3,2): '+ g(2,3,2) ); // Будет выведено:// Значение f(2,3,2): 10// Значение g(2,3,2): 10
Этим приемом удобно пользоваться для сокращения длины кода. Например, если нужно много раз вызвать метод document.write(), то можно ввести переменную: var W = document.write (обратите внимание - без скобок!), а затем вызывать: W('<H1>Лекция</H1>').
Коль скоро функцию можно присвоить переменной, то ее можно передать и в качестве аргумента другой функции.
function kvadrat(a){ return a*a; } function polinom(a,k){ return k(a)+a+5;} alert(polinom(3,kvadrat));// Будет выведено: 17
Все это усиливается при использовании функции eval(), которая в качестве аргумента принимает строку, которую рассматривает как последовательность операторов JavaScript (блок) и выполняет этот блок. В качестве иллюстрации приведем скрипт, который позволяет вычислять функцию f(f(...f(N)...)), где число вложений функции f() задается пользователем.
<SCRIPT>function kvadrat(a){ return a*a; } function SuperPower(){ var N = parseInt(document.f.n.value), K = parseInt(document.f.k.value), L = R = ''; for(i=0; i<K; i++) { L+='kvadrat('; R+=')'; } return eval(L+N+R);}</SCRIPT> <FORM NAME=f> Введите аргумент (число): <INPUT NAME=n><BR> Сколько раз возвести его в квадрат? <INPUT NAME=k><BR> <INPUT TYPE=button value="Возвести" onClick="alert(SuperPower());"></FORM>
Пример 3.1. Многократное вложение функции kvadrat() в себя (html, txt)
Обратите внимание на запись L=R=''. Она выполняется справа налево. Сначала происходит присваивание R=''. Операция присваивания выдает в качестве результата значение вычисленного выражения (в нашем случае - пустая строка). Она-то и присваивается далее переменной L.
Поясним работу скрипта в целом. В функции SuperPower() мы сначала считываем значения, введенные в поля формы, и преобразуем их из строк в целые числа функцией parseInt(). Далее с помощью цикла for мы собираем строку L, состоящую из K копий строки " kvadrat( ", и строку R, состоящую из Kправых скобок " ) ". Теперь мы составляем выражение L+N+R, представляющее собой K раз вложенную в себя функцию kvadrat(), примененную к аргументу N. Наконец, с помощью функции eval() вычисляем полученное выражение. Таким образом, вычисляется функция (...((N)2)2...)2 = N2K.