|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JavaScript 1.2: добавлены свойства arity, arguments.callee; добавлена возможность вложения функций. JavaScript 1.3: добавлены методы apply, call и toSource; не рекомендуется использовать свойство arguments.caller. | |
new Function ([arg1[, arg2[, ... argN]],] functionBody)
Оператор function (см. "function"):
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, но имеются и отличия:
Вложение функций. Вы можете вкладывать функции друг в друга. Вложенная функция (внутренняя) является 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 и более ранние версии. Вы не можете вкладывать один оператор функции в другой оператор либо в самого себя.
| Свойство | Описаниеarguments
| arguments.callee Специфицирует тело функции исполняемой в данный момент функции. arguments.caller Специфицирует имя функции, которая вызывала исполняемую в данный момент функцию. arguments.length arity
| constructor
| length
| prototype |
|---|
| Метод | Описание |
|---|---|
apply | Даёт возможность применять метод другого объекта в контексте вызывающего объекта. |
call | Позволяет вызывать (выполнять) метод другого объекта в контексте вызывающего объекта. |
toSource | Возвращает строку, представляющую исходный код функции. Переопределяет метод Object.toSource. |
toString | Возвращает строку, представляющую исходный код функции. Переопределяет метод Object.toString. |
valueOf | Возвращает строку, представляющую исходный код функции. Переопределяет метод 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
}
Следующие операторы вызывают функцию 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 (не рекомендуется) | |
JavaScript 1.2: добавлено свойство arguments.callee. JavaScript 1.3: не рекомендуется использовать свойство arguments.caller; удалена поддержка имён аргументов и локальных переменных как свойств массива arguments. | |
Вы можете обращаться к аргументам функции, используя массив 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 удалены:
Пример 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; }
Специфицирует имя функции, которая вызвала исполняемую в данный момент функцию.
caller больше не используется.
Свойство caller доступно только в теле функции.
Если исполняемая в данный момент функция была вызвана с верхнего уровня программы JavaScript, значение caller будет null.
Ключевое слово this не относится к исполняемой в данный момент функции, поэтому Вы обязаны к функциям и объектам Function по имени, даже в теле функции.
Свойство caller является ссылкой на вызывающую функцию, поэтому,
Следующий код проверяет значение свойства 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:
result=addNumbers(3,4,5) // возвращает 0
result=addNumbers(3,4) // возвращает 7
result=addNumbers(103,104) // возвращает 207
Специфицирует количество аргументов, ожидаемых функцией.
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
Позволяет вызывать (выполнять) метод другого объекта в контексте данного (вызывающего) объекта.
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");
Специфицирует функцию, которая создаёт прототип объекта. Заметьте, что значением этого свойства является ссылка на функцию, а не строка с именем функции.
См. Object.constructor.
Специфицирует количество аргументов, ожидаемое функцией.
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 Function() {
[native code]
}
Этот метод обычно вызывается JavaScript внутренне, а не явно в коде. Вы можете вызывать toSource при отладке для проверки содержимого объекта.
Возвращает строку, представляющую исходный код функции.
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; }
Возвращает строку, представляющую исходный код функции.
valueOf()
Метод valueOf возвращает следующие значения:
function Function() {
[native code]
}
Этот метод обычно вызывается JavaScript внутренне, а не явно в коде.
Дата последнего обновления: 28 мая 1999 года.
Copyright (c) 1999 Netscape Communications Corporation
|