Клиентский JavaScript. Справочник

         

созданные конструктором 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)

Содержание раздела