созданные конструктором Function, вычисляются каждый
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 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. Следующий код присваивает функцию обработчику onFocus (имя обработчика обязано записываться в нижнем регистре):
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)