Специфицирует строку JavaScript-кода, компилируемую как функция.
JavaScript 1.2: добавлены свойства
JavaScript 1.3: добавлены методы | |
new Function ([arg1[, arg2[, ... argN]],] functionBody)
Оператор function
(см. "function"):
function name([param[, param[, ... param]]]) {
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 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)
JavaScript 1.1 и более ранние версии. Вы не можете вкладывать один оператор функции в другой оператор либо в самого себя.
Свойство | Описание
|
Специфицирует тело функции исполняемой в данный момент функции.
Специфицирует имя функции, которая вызывала исполняемую в данный момент функцию.
|
|
|
|
---|
Метод | Описание |
---|---|
| Даёт возможность применять метод другого объекта в контексте вызывающего объекта. |
| Позволяет вызывать (выполнять) метод другого объекта в контексте вызывающего объекта. |
| Возвращает строку,
представляющую исходный код функции. Переопределяет метод |
| Возвращает строку,
представляющую исходный код функции. Переопределяет метод |
| Возвращает строку,
представляющую исходный код функции. Переопределяет метод |
Пример 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
}
Следующие операторы вызывают функцию padZeros
:
result=padZeros(42,4) // возвращает "0042"
result=padZeros(42,2) // возвращает "42"
result=padZeros(5,4) // возвращает "0005"
Пример 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(thisArg[, argArray])
thisArg | |
argArray |
Можно присваивать различные 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
.
function product(name, value){
this.name = name;
if(value > 1000)
this.value = 999;
else
this.value = value;
}
function prod_dept(name, value, dept){
this.dept = dept;
product.apply(product, arguments);
}
prod_dept.prototype = new product();
// поскольку 5 меньше 100, значение устанавливается
cheese = new prod_dept("feta", 5, "food");
// поскольку 5000 больше 1000, значение будет 999
car = new prod_dept("honda", 5000, "auto");
Function.call
Массив, соответствующий аргументам, передаваемым функции.
| |
JavaScript 1.2: добавлено свойство JavaScript 1.3: не рекомендуется использовать
свойство | |
Вы можете обращаться к аргументам функции, используя массив arguments
.
Этот массив содержит вхождение для каждого аргумента, передаваемого функции.
Например, если функции передаются три аргумента, Вы можете обратиться к аргументам так:
arguments[0]
arguments[1]
arguments[2]
Массиву arguments
может предшествовать
также имя функции:
myFunc.arguments[0]
myFunc.arguments[1]
myFunc.arguments[2]
Массив arguments
доступен только внутри тела функции.
Попытка получить доступ к массиву arguments
вне объявления функции приведёт к ошибке.
Вы можете использовать массив arguments
при вызове функции с бо́льшим количеством аргументов, чем она принимает по
формальному объявлению. Эта техника используется для тех функций, которым можно
передавать переменное количество аргументов. Вы можете использовать arguments.length
для определения количества аргументов, передаваемых функции, и последующей
обработки каждого аргумента с использованием массива arguments
. (Для
определения количества аргументов, объявленных при определении функции,
используйте свойство Function.length
.)
Массив arguments
имеет следующие свойства:
Свойство | Описание |
---|---|
Специфицирует имя функции, вызвавшей исполняемую в данный момент функцию. (Не рекомендуется.) | |
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
}
Вы можете передать этой функции любое количеств аргументов, и она создаст список из всех аргументов как элементов списка.
// возвращает "red, orange, blue, "
myConcat(", ","red","orange","blue")
// возвращает "elephant; giraffe; lion; cheetah;"
myConcat("; ","elephant","giraffe","lion", "cheetah")
// возвращает "sage. basil. oregano. pepper. parsley. "
myConcat(". ","sage","basil","oregano", "pepper", "parsley")
Пример 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>
Специфицирует тело исполняемой в данный момент функции.
Свойство callee
доступно только в теле функции.
Ключевое слово this
не относится к
исполняемой в данный момент функции. Используйте свойство callee
для обращения к функции в теле этой функции.
Следующая функция возвращает значение свойства callee
этой функции.
function myFunc() {
return arguments.callee
}
Возвращается следующее значение:
function myFunc() { return arguments.callee; }
Function.arguments
Специфицирует имя функции, которая вызвала исполняемую в данный момент функцию.
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)
}
Function.arguments
Специфицирует количество аргументов, передаваемых функции.
arguments.length
выдаёт количество аргументов, реально переданных функции.
В отличие от него, свойство Function.length
указывает, сколько аргументов функция ожидает.
Использование Function.length
и arguments.length
.
function addNumbers(x,y){
if (arguments.length == addNumbers.length) {
return (x+y)
}
else return 0
}
Если Вы передаёте этой функции больше двух аргументов, она возвращает 0:
result=addNumbers(3,4,5) // возвращает 0
result=addNumbers(3,4) // возвращает 7
result=addNumbers(103,104) // возвращает 207
Function.arguments
Специфицирует количество аргументов, ожидаемых функцией.
arity
является внешним относительно функции и указывает, какое
количество аргументов функция ожидает. В отличие от него, arguments.length
предоставляет количество аргументов, реально переданных функции.
Использование arity
и
arguments.length
.
function addNumbers(x,y){
if (arguments.length == addNumbers.length) {
return (x+y)
}
else return 0
}
Если Вы передаёте этой функции более двух аргументов, она возвращает 0:
result=addNumbers(3,4,5) // возвращает 0
result=addNumbers(3,4) // возвращает 7
result=addNumbers(103,104) // возвращает 207
arguments.length
, Function.length
Позволяет вызывать (выполнять) метод другого объекта в контексте данного (вызывающего) объекта.
call(thisArg[, arg1[, arg2[, ...]]])
thisArg | |
arg1, arg2, ... |
Вы можете присвоить разные объекты this
при вызове существующей функции.
this
ссылается на текущий (вызывающий) объект.
С помощью call
Вы можете записать метод однократно и затем
наследовать его в другом объекте без необходимости записывать его ещё раз для
нового объекта.
Вы можете использовать call
для создания
цепочки конструкторов объектов, как в Java. В следующем примере конструктор
объекта product
определён с двумя параметрами, name
и value
. Другой объект,
prod_dept
, инициализирует свою уникальную переменную (dept
)
и вызывает конструктор объекта product
в своём конструкторе для инициализации других переменных.
function product(name, value){
this.name = name;
if(value > 1000)
this.value = 999;
else
this.value = value;
}
function prod_dept(name, value, dept){
this.dept = dept;
product.call(this, name, value);
}
prod_dept.prototype = new product();
// поскольку 5 меньше 100, значение устанавливается
cheese = new prod_dept("feta", 5, "food");
// поскольку 5000 больше 1000, значение будет 999
car = new prod_dept("honda", 5000, "auto");
Function.apply
Специфицирует функцию, которая создаёт прототип объекта. Заметьте, что значением этого свойства является ссылка на функцию, а не строка с именем функции.
См. Object.constructor
.
Специфицирует количество аргументов, ожидаемое функцией.
length
является внешним относительно функции и указывает, сколько
аргументов функция ожидает. В противоположность ему, arguments.length
является локальным относительно функции и представляет количество аргументов,
реально переданных функции.
См. пример для arguments.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
, будут иметь это свойство:
anotherArray=new Array()
anotherArray.description="Currently empty"
Здесь создаётся метод 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.prototype.rep = str_rep
s1a=s1.rep(3) // возвращает "aaa"
s2a=s2.rep(5) // возвращает "bbbbb"
s3a=s3.rep(2) // возвращает "cc"
// Создаётся альтернативный метод и присваивается только одной String-переменной
function fake_rep(n) {
return "repeat " + this + " " + n + " times."
}
s1.rep = fake_rep
s1b=s1.rep(1) // возвращает "repeat a 1 times."
s2b=s2.rep(4) // возвращает "bbbb"
s3b=s3.rep(6) // возвращает "cccccc"
Функция из этого примера работает также со
String
-объектами, созданными без
использования конструктора
String
. Следующий код возвращает "zzz"
.
"z".rep(3)
Возвращает строку, представляющую исходный код функции.
toSource()
Метод toSource
возвращает следующие значения:
Function
метод toSource
возвращает следующие строки, указывающие на недоступность исходного кода:
function Function() {
[native code]
}
toSource
возвращает исходный код JavaScript,
который определяет объект как строку.Этот метод обычно вызывается JavaScript внутренне, а не явно в коде. Вы можете вызывать toSource при отладке для проверки содержимого объекта.
Function.toString
,
Object.valueOf
Возвращает строку, представляющую исходный код функции.
toString()
Объект 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 Dog(name, breed, color, sex) { this.name = name; this.breed = breed; this.color = color; this.sex = sex; }
Object.toString
Возвращает строку, представляющую исходный код функции.
valueOf()
Метод valueOf
возвращает следующие значения:
Function
метод valueOf
возвращает следующую строку, указывающую, что
исходный код недоступен:function Function() {
[native code]
}
toSource
возвращает исходный код JavaScript,
который определяет объект, в виде строки. Этот метод эквивалентен методу toString
функции.Этот метод обычно вызывается JavaScript внутренне, а не явно в коде.
Function.toString
, Object.valueOf
Дата последнего обновления: 28 мая 1999 года.
Copyright (c) 1999