JavaScript. Функции и объекты

Функции рассматриваются как:
  • тип данных
  • обьект
  • конструктор объекта

Функции как тип данных

Определяют функцию при помощи ключевого слова function: function определяет переменную с именем f. Эта переменная имеет тип function: Эта переменная, как и любая другая, имеет значение - свой исходный текст: Метод valueOf() применим как к числовой переменной i, так и к переменной f, и возвращает их значение. Более того, значение переменной f можно присвоить другой переменной, тем самым создав "синоним" функции f: Этим приемом удобно пользоваться для сокращения длины кода. Если нужно много раз вызвать метод document.write(), то можно ввести переменную: var W = document.write (обратите внимание - без скобок!), а затем вызывать: W('<br /> <h1> Лекция</h1> ').
 Функцию можно присвоить переменной, ее можно передать и в качестве аргумента другой функции. При использовании функции eval(), выполняется входящая в ее аргументы строка как блок кода. В следующем примере скрипт позволяет вычислять функцию f(f(...f(N)...)), где число вложений функции f() задается пользователем. Запись L=R='' выполняется справа налево. Сначала происходит присваивание R=''. Операция присваивания выдает в качестве результата значение вычисленного выражения (в нашем случае - пустая строка). Она присваивается далее переменной L.
В функции SuperPower() мы сначала считываем значения, введенные в поля формы, и преобразуем их из строк в целые числа функцией parseInt(). Далее с помощью цикла for мы собираем строку L, состоящую из K копий строки " kvadrat( ", и строку R, состоящую из K правых скобок " ) ". Теперь мы составляем выражение L+N+R, представляющее собой K раз вложенную в себя функцию kvadrat(), примененную к аргументу N. Наконец, с помощью функции eval() вычисляем полученное выражение. Таким образом, вычисляется функция \((...((N)^{2})^{2}...)^{2} = N^{2k}\).

Функция как объект

У любого типа данных JavaScript существует объектовая "обертка" (wrapper), которая позволяет применять методы типов данных к переменным и литералам, а также получать значения их свойств. Например, длина строки символов определяется свойством length. Аналогичная "обертка" есть и у функций - это класс объектов Function.
Например, увидеть значение функции можно не только при помощи метода valueOf(), но и используя метод toString():
Результат распечатки: function f(x,y) { return x-y;}.
Свойства же функции как объекта доступны программисту только тогда, когда они вызываются внутри этой функции. Наиболее часто используемыми свойствами являются: массив (коллекция) аргументов функции ( arguments[] ), его длина ( length ), имя функции, вызвавшей данную функцию ( caller ), и прототип ( prototype ).
Рассмотрим пример использования списка аргументов функции и его длины:
Чтобы узнать, какая функция вызвала данную функцию, используется свойство caller. Возвращаемое ею значение имеет тип function. Пример: Результат исполнения:
\(function M() { s(); return 5; }\)
\(function N() { s(); return 7; }\)
Еще одним свойством объекта класса Function является prototype. Но это - общее свойство всех объектов, не только функций, поэтому и обсуждать его мы будем в следующем разделе в контексте типа данных Object. Упомянем только о конструкторе объекта класса Function: Здесь f - это объект класса Function (его можно использовать как обычную функцию), arg_1, ..., arg_n - аргументы функции f, а body - строка, задающая тело функции f.
Данный конструктор можно использовать, например, для описания функций, которые назначают или переопределяют методы объектов. Здесь мы вплотную подошли к вопросу конструирования объектов. Дело в том, что переменные внутри функции можно рассматривать в качестве ее свойств, а функции - в качестве методов: Ключевое слово this позволяет сослаться на текущий объект, в рамках которого происходит исполнение JavaScript-кода.В данном случае это объект класса Rectangle.

Комментарии

Популярные сообщения