function name([param[, param[, ... param]]]) { statements }
Параметры
arg1, arg2, ... argN
Имена, используемые
функцией в качестве имён формальных аргументов. Каждое имя обязано быть строкой,
соответствующей верному JavaScript-идентификатору; например,
"x" или "theValue".
functionBody
Строка операторов JavaScript, образующих определение функции.
name
Имя функции.
param
Имя аргумента, передаваемого функции. Функция может иметь до 255 аргументов.
statements
Операторы, образующие тело функции.
Описание
Function-объекты,
созданные конструктором Function, вычисляются каждый раз при их
использовании. Это менее эффективно, чем объявление функции и вызов её внутри
Вашего кода, поскольку объявленные функции компилируются.
Чтобы возвращать значение, функция обязана иметь оператор
return, который специфицирует возвращаемое значение.
Все параметры передаются функции по значению;
значение передаётся функции, но если функция изменяет значение параметра, это
изменение не отражается глобально или в вызывающей функции. Однако, если Вы
передаёте функции объект в качестве параметра и функция изменяет свойства объекта, эти изменения видны вне функции,
как показано в следующем примере:
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 было изменено функцией)
Ключевое слово this не ссылается на
выполняемую в данный момент функцию,
поэтому Вы обязаны обращаться к Function-объектам по имени, даже в теле функции.
Доступ к аргументам функции через массив arguments. Вы
можете обращаться в функции к аргументам функции, используя массив arguments.
См. arguments.
Специфицирование аргументов в конструкторе Function.
Следующий код создаёт Function-объект, принимающий два аргумента:
var multiply = new Function("x", "y", "return x * y")
Аргументы "x" и "y" являются
формальными именами аргументов, которые используются в теле функции, "return x * y".
Предыдущий код присваивает функцию переменной multiply.
Для вызова Function-объекта Вы можете специфицировать имя
переменной, как если бы она была функцией, как показано далее в примерах:
var theAnswer = multiply(7,6)
var myAge = 50 if (myAge >=39) {myAge=multiply (myAge,.5)}
Присвоение функции переменной конструктором Function.
Предположим, Вы создаёте переменную multiply с использованием конструктора Function,
как показано в предыдущем разделе:
var multiply = new Function("x", "y", "return x * y")
Это похоже на следующее объявление функции:
function multiply(x,y) { return x*y }
Присвоение функции переменной с использованием
конструктора Function похоже на объявление функции оператором function,
но имеются и отличия:
Когда Вы присваиваете
функцию переменной с использованием var multiply = new Function("..."), multiply
является переменной, для которой текущее значение является ссылкой на функцию, созданную как new Function().
Когда Вы создаёте функцию с использованием function multiply() {...},
multiply является не переменной, а именем функции.
Вложение функций.
Вы можете вкладывать функции друг в друга. Вложенная функция (внутренняя)
является private для содержащей её (внешней) функции:
Доступ к внутренней функции
может быть получен только через операторы внешней функции.
Внутренняя функция может использовать аргументы и переменные внешней функции.
Внешняя функция не может использовать аргументы и переменные внутренней функции.
Если функция содержит вложенную функцию, Вы можете
вызывать внешнюю функцию и специфицировать аргументы для внешней и внутренней функции:
function outside(x) { function inside(y) {
return x+y } return inside
} result=outside(3)(5) // возвращает 8
Специфицирование обработчика события объектом Function.
Следующий код присваивает функцию обработчику onFocus (имя
обработчика обязано записываться в нижнем регистре):
window.onfocus = new Function("document.bgColor='antiquewhite'")
Если функция присваивается переменной, Вы можете
присвоить переменную обработчику события. Следующий код присваивает функцию
переменной setBGColor.
var setBGColor = new Function("document.bgColor='antiquewhite'")
Вы можете использовать эту переменную для присвоения
функции обработчику события одним из следующих способов:
После того как Вы получили ссылку на Function-объект,
Вы можете использовать его как функцию, и он будет конвертирован из объекта в функцию:
window.onfocus()
Обработчики событий не принимают аргументов, поэтому Вы не можете объявлять
никакие аргументы в конструкторе Function для обработчика события.
Например, Вы не можете вызывать функцию multiply через такую
установку свойства onclick кнопки:
document.form1.button1.onclick=multFun(5,10)
Обратная Совместимость
JavaScript 1.1 и более ранние версии.
Вы не можете вкладывать один оператор функции в другой оператор либо в самого себя.
Возвращает строку,
представляющую исходный код функции. Переопределяет метод Object.valueOf.
Примеры
Пример 1. Эта функция возвращает строку, содержащую отформатированное
представление чисел с заполнением ведущими нулями.
// Эта функция возвращает строку, заполненную ведущими нулями function
padZeros(num, totalLen) { var numStr = num.toString() //инициализируется return-значение как строка
var numZeros = totalLen - numStr.length // вычисляется количество нулей
if (numZeros > 0) { for (var i = 1;
i <= numZeros; i++) { numStr = "0" + numStr
} } return numStr }
Пример 2.
Вы можете определить, существует ли функция, сравнив имя функции с null. В
следующем примере func1 вызывается, если функция noFunc не существует;
иначе вызывается функция func2. Заметьте, что требуется имя окна при обращении к функции noFunc.
if (window.noFunc == null) func1() else func2()
Пример 3. Здесь создаётся обработчики события
onFocus и
onBlur для фрэйма. Этот код
находится в том же файле, который содержит тэг FRAMESET. Заметьте,
штаа это единственный способ создания обработчиков onFocus и
onBlur для фрэйма, поскольку Вы
не можете специфицировать обработчики в тэге FRAME.
frames[0].onfocus = new Function("document.bgColor='antiquewhite'")
frames[0].onblur = new Function("document.bgColor='lightgrey'")
apply
Даёт возможность применить метод другого объекта в контексте вызывающего объекта.
Можно присваивать различные this-объекты при вызове существующей функции.
this относится к текущему объекту, вызывающему объекту. С помощью apply
Вы можете записать метод только один раз и затем наследовать его в другом
объекте без необходимости повторно записывать этот метод для нового объекта.
apply
очень похож на call, за исключением поддерживаемых типов аргументов.
Вы можете использовать массив arguments вместо именованного набора параметров. С
помощью apply Вы можете использовать литерал массива, например, apply(this, [name, value]),
или объект Array, например, apply(this, new Array(name, value)).
Вы можете также использовать arguments
для параметра argArray. arguments является локальной переменной функции.
Он может использоваться для всех неспецифицированных аргументов вызываемого
объекта. Таким образом, Вы не обязаны знать аргументы вызываемого объекта, когда
используете метод apply. Вы можете использовать arguments
для передачи всех аргументов вызываемому объекту. Вызванный объект тогда
отвечает за обработку этих аргументов.
Пример
Можно использовать apply для создания цепочки конструкторов объекта,
как в Java. В следующем примере конструктор объекта product
определяется с двумя параметрами, name и value. Другой объект,
prod_dept, инициализирует свою уникальную переменную (dept)
и вызывает конструктор для product в своём конструкторе для
инициализации других переменных. Здесь параметр arguments
использован для всех аргументов конструктора объекта product.
JavaScript 1.3: не рекомендуется использовать
свойство arguments.caller; удалена
поддержка имён аргументов и локальных переменных как свойств массива arguments.
Версия ECMA
ECMA-262
Описание
Вы можете обращаться к аргументам функции, используя массив arguments.
Этот массив содержит вхождение для каждого аргумента, передаваемого функции.
Например, если функции передаются три аргумента, Вы можете обратиться к аргументам так:
arguments[0] arguments[1] arguments[2]
Массиву arguments может предшествовать
также имя функции:
Массив arguments доступен только внутри тела функции.
Попытка получить доступ к массиву arguments вне объявления функции приведёт к ошибке.
Вы можете использовать массив arguments
при вызове функции с бо́льшим количеством аргументов, чем она принимает по
формальному объявлению. Эта техника используется для тех функций, которым можно
передавать переменное количество аргументов. Вы можете использовать arguments.length
для определения количества аргументов, передаваемых функции, и последующей
обработки каждого аргумента с использованием массива arguments. (Для
определения количества аргументов, объявленных при определении функции,
используйте свойство Function.length.)
Специфицирует количество аргументов, передаваемых функции.
Обратная Совместимость
JavaScript 1.1 и 1.2. Следующие
возможности JavaScript 1.1 и JavaScript 1.2 удалены:
Каждая локальная переменная функции является свойством массива
arguments. Например, если функция myFunc имеет
локальную переменную myLocalVar, Вы можете обратиться к
переменной arguments.myLocalVar.
Каждый формальный аргумент функции является свойством массива arguments.
Например, если функция myFunc имеет два аргумента arg1
и arg2, Вы можете обратиться к аргумента arguments.arg1 и
arguments.arg2. (Вы можете также обратиться к ним arguments[0] и
arguments[1].)
Примеры
Пример 1. Здесь определена функция, выполняющая конкатенацию/объединение нескольких строк.
Единственным формальным аргументом функции является строка, специфицирующая
символ-разделитель объединяемых строк. Функция определена так:
function myConcat(separator) { result="" // инициализация списка
// итерация по arguments for (var i=1;
i<arguments.length; i++) { result += arguments[i] + separator
} return result }
Вы можете передать этой функции любое количеств аргументов, и она создаст список
из всех аргументов как элементов списка.
Пример 2. Определяется функция, создающая HTML-списки. Единственным
формальным аргументом этой функции является строка, которая содержит "U",
если это неупорядоченный список (bulleted), или "O", если это упорядоченный список (numbered). Функция
определена так:
function list(type) { document.write("<"
+ type + "L>") // начало списка // итерация по arguments
for (var i=1; i<arguments.length; i++) {
document.write("<LI>" + arguments[i]) }
document.write("</" + type + "L>") // конец списка }
Вы можете передать этой функции любое количество аргументов, и она отобразит
каждый аргумент как элемент списка указанного типа. Например, следующий вызов функции
list("U", "One", "Two", "Three")
даст на выходе
<UL> <LI>One <LI>Two <LI>Three </UL>
arguments.callee
Специфицирует тело исполняемой в данный момент функции.
Специфицирует имя функции, которая вызвала исполняемую в данный момент функцию.
Свойство из
Function
Реализовано в
JavaScript 1.1, NES 2.0
В JavaScript 1.3 не рекомендуется применять.
Описание
caller больше не используется.
Свойство caller доступно только в теле функции.
Если исполняемая в данный момент функция была вызвана с
верхнего уровня программы JavaScript, значение caller будет null.
Ключевое слово this не относится к исполняемой в данный момент
функции, поэтому Вы обязаны к функциям и объектам Function по имени, даже в теле функции.
Свойство caller является ссылкой на вызывающую функцию, поэтому,
Если Вы используете её в строковом контексте, Вы получите результат вызова
functionName.toString. То есть декомпилированную каноническую исходную форму функции.
Вы также можете вызвать вызывающую функцию, если знаете аргументы, которые ей
могут быть нужны. Таким образом, вызываемая функция может вызвать вызывающую
функцию, не зная её имени, предполагая, что все её вызыватели имеют одну форму
и размер и что они не будут необусловленно вызывать вызываемую функцию ещё раз (что может привести к бесконечной рекурсии).
Примеры
Следующий код проверяет значение свойства caller функции:
function myFunc() { if (arguments.caller == null) {
return ("The function was called from the top!")
} else return ("This function's caller was " + arguments.caller) }
arguments.length выдаёт количество аргументов, реально переданных функции.
В отличие от него, свойство Function.length
указывает, сколько аргументов функция ожидает.
Пример
Использование Function.length и arguments.length.
function addNumbers(x,y){ if
(arguments.length == addNumbers.length) { return (x+y)
} else return 0 }
Если Вы передаёте этой функции больше двух аргументов, она возвращает 0:
arity является внешним относительно функции и указывает, какое
количество аргументов функция ожидает. В отличие от него, arguments.length
предоставляет количество аргументов, реально переданных функции.
Вы можете присвоить разные объекты this при вызове существующей функции.
this ссылается на текущий (вызывающий) объект.
С помощью call Вы можете записать метод однократно и затем
наследовать его в другом объекте без необходимости записывать его ещё раз для
нового объекта.
Примеры
Вы можете использовать call для создания
цепочки конструкторов объектов, как в Java. В следующем примере конструктор
объекта product определён с двумя параметрами, name и value. Другой объект,
prod_dept, инициализирует свою уникальную переменную (dept)
и вызывает конструктор объекта product в своём конструкторе для инициализации других переменных.
Специфицирует функцию, которая создаёт прототип объекта. Заметьте, что значением
этого свойства является ссылка на функцию, а не строка с именем функции.
length является внешним относительно функции и указывает, сколько
аргументов функция ожидает. В противоположность ему, arguments.length
является локальным относительно функции и представляет количество аргументов,
реально переданных функции.
Значение, из которого создаются экземпляры
определённого класса. Каждый объект, который может быть создан вызовом
конструктора функции, имеет ассоциированное свойство prototype.
Вы можете добавлять в существующий класс новые свойства или методы, добавляя их
в прототип, ассоциированный с конструктором данного класса. Синтаксис добавления нового свойства или метода таков:
fun.prototype.name = value
где
fun
Имя конструктора объекта, который вы хотите изменить.
name
Имя создаваемого свойства или метода.
value
Значение, присвоенное первоначально новому свойству или методу.
Если Вы добавляете свойство в прототип объекта, то все
объекты, созданные этой функцией-конструктором этих объектов, будут иметь это
новое свойство, даже если объекты существовали до создания нового свойства.
Например, предположим, имеются такие операторы:
var array1 = new Array(); var array2 = new Array(3);
Array.prototype.description=null; array1.description="Contains some stuff" array2.description="Contains other stuff"
После установки свойства в прототипе все объекты, созданные с помощью Array, будут иметь это свойство:
Здесь создаётся метод str_rep и используется оператор
String.prototype.rep = str_rep для добавления метода всем объектам
String. Все объекты, созданные с помощью
new String(), имеют теперь и этот метод, хотя объекты уже были
созданы раньше. Затем создаётся альтернативный метод и добавляется к одному из
объектов String через
использование оператора s1.rep = fake_rep. Метод str_rep
других String-объектов не изменяется.
var s1 = new String("a") var s2 = new String("b") var s3 = new String("c")
// Создаётся метод repeat-string-N-times для всех объектов String function
str_rep(n) { var s = "", t = this.toString()
while (--n >= 0) s += t return s }
// Создаётся альтернативный метод и присваивается только одной String-переменной
function fake_rep(n) {
return "repeat " + this + " " + n + " times." }
Объект Function переопределяет метод toString
объекта Object; он не наследует Object.toString.
Для объектов Function метод toString
возвращает строку, представляющую объект.
JavaScript вызывает метод toString автоматически, если
Function представлен как текстовое значение
или если на Function имеется ссылка при конкатенации строк.
Для объектов Function
встроенный метод toString декомпилирует функцию обратно в исходный
код JavaScript, который определяет функцию. Эта строка содержит ключевое слово function, список аргументов,
фигурные скобки и тело функции.
Например, имеется
следующий код, где определяется тип объектов Dog и создаётся theDog,
объект типа Dog:
function Dog(name,breed,color,sex) { this.name=name this.breed=breed this.color=color this.sex=sex
}
theDog = new Dog("Gabby","Lab","chocolate","girl")
Когда Dog используется в строковом контексте, JavaScript
автоматически вызывает функцию toString, которая возвращает следующие строки:
Для встроенного объекта Function
метод valueOf возвращает следующую строку, указывающую, что
исходный код недоступен:
function Function() {
[native code] }
Для специальных функций метод toSource возвращает исходный код JavaScript,
который определяет объект, в виде строки. Этот метод эквивалентен методу toString функции.
Этот метод обычно вызывается JavaScript внутренне, а не явно в коде.