Function
xxx Надеюсь, что я удалил все примеры с клиентской спецификой из этого файла.
Специфицирует строку кода JavaScript, компилируемого как функция.
Объект ядра
Реализован в
JavaScript 1.1, NES 2.0
JavaScript 1.2: добавлены свойства , ; добавлена возможность вложения функций.
JavaScript 1.3: добавлены методы ,
и ; не рекомендуется использовать свойство .
JavaScript 1.4: не рекомендуются свойства , ,
и (arguments
остаётся локальной переменной функции, а не свойством в Function).
Версия ECMA
ECMA-262
Создание
Конструктор Function:
new Function ([arg1[, arg2[, ... argN]],] FunctionBody)
Оператор Function (см. ):
Function name([param[, param[, ... param]]]) {
операторы
}
Параметры
arg1, arg2, ... argN |
Имена, используемые функцией в качестве имён формальных аргументов. Каждый обязан быть строкой - правильным идентификатором JavaScript; например "x" или "theValue".
FunctionBody
Строка операторов JavaScript, образующих определение функции.
name
param
Имя аргумента, передаваемого функции. Функция может иметь до 255 аргументов.
statements
Описание
Function-объекты, созданные конструктором Function, вычисляются каждый раз, когда используются. Это менее эффективно, чем объявление функции и вызов её в Вашем коде, поскольку объявленные функции компилируются.
Чтобы возвратить значение, функция обязана содержать оператор , специфицирующий возвращаемое значение.
Все параметры передаются функции по значению; значение передаётся функции, но, если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаёте функции объект в качестве параметра и функция изменяет свойства объекта, это изменение видно вне функции, как показано в следующем примере:
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. См. .
Специфицирование аргументов в конструкторе 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 addSquares (a,b) {
Function square(x) {
return x*x
}
return square(a) + square(b)
}
a=addSquares(2,3) // возвращает 13
b=addSquares(3,4) //
возвращает 25
c=addSquares(4,5) //
возвращает 41
Если функция содержит вложенную функцию, Вы можете вызывать внешнюю функцию и специфицировать аргументы для обеих функций, внутренней и внешней:
Function outside(x) {
Function inside(y) {
return x+y
}
return inside
}
result=outside(3)(5) //
возвращает 8
Специфицирование обработчика событий объектом Function.
Следующий код присваивает функцию обработчику события для window (весь обработчик события обязан вводиться в нижнем регистре):
window.onFocus = new Function("document.bgColor='antiquewhite'")
Если функция назначается переменной, Вы можете назначить переменную обработчику событий. Следующий код назначает функцию переменной setBGColor:
var setBGColor = new Function("document.bgColor='antiquewhite'")
Вы можете использовать эту переменную для назначения функции обработчику события одним из следующих способов:
document.form1.colorButton.onclick=setBGColor
<INPUT NAME="colorButton" TYPE="button"
VALUE="Change background color"
onClick="setBGColor()">
После того как Вы получили ссылку на объект Function, Вы можете использовать её как функцию, и она будет конвертировать объект в функцию:
window.onFocus()
Обработчики событий не принимают аргументов, поэтому Вы не можете объявлять аргументы для обработчика события в конструкторе Function. Например, Вы не можете вызвать функцию multiply путём установки свойства onclick
кнопки таким образом:
document.form1.button1.onclick=multFun(5,10)
Обратная Совместимость
JavaScript 1.1 и более ранние версии.
Вы не можете вкладывать оператор функции в другой оператор или в себя самого.
Свойства. Резюме.
Свойство
Описание
Специфицирует тело выполняемой в данный момент функции.
Специфицирует имя функции, которая вызвала выполняемую в данный момент функцию.
Метод. Резюме.
Метод
Описание
Позволяет применять метод одного объекта в контексте другого объекта (вызывающего объекта).
Позволяет вызывать (выполнять) метод другого объекта в контексте другого объекта (вызывающего объекта).
Возвращает строку исходного кода функции. Переопределяет метод .
Возвращает строку исходного кода функции. Переопределяет метод .
Возвращает строку исходного кода функции. Переопределяет метод .
Примеры
Пример 1.
Эта функция возвращает строку, содержащую форматированное представление чисел с заполнением ведущими нулями.
// Эта функция возвращает строку, с заполнением ведущими нулями
Function padZeros(num, totalLen) {
var numStr = num.toString() // Инициализируется return-значение
// как string
var numZeros = totalLen - numStr.length // Подсчитывается количество нулей
if (numZeros > 0) {
for (var i = 1; i <= numZeros; i++) {
numStr = "0" + numStr
}
}
return numStr
}
Следующие операторы вызывают функцию padZeros:
result=padZeros(42,4) // возвращает "0042"
result=padZeros(42,2) //
возвращает "42"
result=padZeros(5,4) //
возвращает "0005"
Пример 2.
Вы можете определить, существует ли функция, сравнивая имя функции с null. В этом примере func1
вызывается, если функция noFunc не существует; иначе вызывается func2. Заметьте, что необходимо window-имя при ссылке на функцию с именем noFunc.
if (window.noFunc == null)
func1()
else func2()
Пример 3.
Здесь создаются обработчики событий и для фрэйма. Этот код находится в том же файле, в котором содержится тэг FRAMESET. Обратите внимание, что это единственный способ создания обработчиков событий и для фрэйма, поскольку Вы не можете специфицировать обработчики событий в тэге FRAME.
frames[0].onFocus = new Function("document.bgColor='antiquewhite'")
frames[0].onBlur = new Function("document.bgColor='lightgrey'")
apply">
Операция function определяет анонимную функцию внутри выражения.
Реализована в
Синтаксис
{var | const} variableName = function(parameters) {functionBody};
Описание
Следующие примеры показывают использование операции function.
Этот пример объявляет безымянную функцию внутри выражения. В переменную x устанавливается функция, возвращающая квадрат аргумента:
var x = function(y) {return y*y};
Этот пример объявляет массив a как массив из трёх функций:
var a = [function(y) {return y}, function y {return y*y}, function (y) [return y*y*y}];
Для этого массива, a[0](5) возвращает 5, a[1](5) возвращает 25, a[2](5) возвращает 125.
Объявляет функцию со специфицированными параметрами. В качестве параметров принимаются строки, числа и объекты.
Реализован в |
JavaScript 1.0, NES 2.0 JavaScript 1.5, NES 6.0: добавлено объявление условной функции (расширение Netscape). | ||
Версия ECMA |
ECMA-262 |
Синтаксис
function name([param] [, param] [..., param]) {
statements
}
Вы можете также определять функции с помощью конструктора и оператора ; см. и .
Параметры
name |
Имя функции. | |
param |
Имя аргумента, передаваемого функции. Функция может иметь не более 255 аргументов. | |
statements |
Операторы, образующие тело функции. |
Описание
Чтобы возвращать значение, функция обязана иметь оператор , который специфицирует возвращаемое значение.
Функция, созданная с помощью оператора function, является объектом Function и содержит все свойства, методы и поведение объектов Function. См. в детальную информацию о функциях.
Netscape поддерживает условное объявление функций, когда функция может быть объявлена на базе вычисления некоторого условия. Если условие true, функция объявляется. Иначе - не объявляется.
Функция может быть также объявлена внутри выражения. В этом случае функция обычно анонимна.
Примеры
Этот код объявляет функцию, которая возвращает общую сумму от продаж в долларах, если задано количество проданных единиц продуктов a, b и c.
function calc_sales(units_a, units_b, units_c) {
return units_a*79 + units_b*129 + units_c*699
}
В следующем скрипте функция one всегда объявляется. Функция zero объявляется, поскольку 'if(1)' вычисляется в true:
<SCRIPT language="JavaScript1.5">
<!--
function one()
document.writeln("This is one.");
if (1)
function zero()
{
document.writeln("This is zero.");
}
}
</SCRIPT>
Однако, если скрипт изменяется таким образом, что условие становится 'if (0)', функция zero не объявляется и не может быть вызвана.
См. также
, .