Назад Вперёд |
Ядро JavaScript 1.5. Справочник. |
xxx Надеюсь, что я удалил все примеры с клиентской спецификой из этого файла.
Специфицирует строку кода JavaScript, компилируемого как функция.
JavaScript 1.2: добавлены свойства
JavaScript 1.3: добавлены методы
JavaScript 1.4: не рекомендуются свойства | |
Function
:
new Function ([arg1[, arg2[, ... argN]],] FunctionBody)
Function
(см.
Function
):
Function name([param[, param[, ... param]]]) {
операторы
}
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
.
Function
.Этот код создаёт объект Function
, принимающий два аргумента.
var multiply = new Function("x", "y", "return x * y")
Аргументы "x" и "y" являются именами формальных аргументов, которые используются в теле функции, "return x * y".
Вышеприведённый код присвоил функцию переменной multiply
.
Чтобы вызвать объект Function
,
Вы можете специфицировать имя переменной, как если бы это была функция, что показано в следующем примере:
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
(весь обработчик события обязан вводиться в нижнем регистре):
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
,
Вы можете использовать её как функцию, и она будет конвертировать объект в функцию:
Обработчики событий не принимают аргументов, поэтому Вы не можете объявлять
аргументы для обработчика события в конструкторе Function
.
Например, Вы не можете вызвать функцию multiply
путём установки свойства onclick
кнопки таким образом:
document.form1.button1.onclick=multFun(5,10)
Вы не можете вкладывать оператор функции в другой оператор или в себя самого.
Свойство | Описание |
---|---|
arguments |
|
arguments.callee | |
arguments.caller | Специфицирует имя функции, которая вызвала выполняемую в данный момент функцию. |
arguments.length |
|
arity |
|
constructor |
|
length |
|
prototype |
Метод | Описание |
---|---|
apply |
Позволяет применять метод одного объекта в контексте другого объекта (вызывающего объекта). |
call |
Позволяет вызывать (выполнять) метод другого объекта в контексте другого объекта (вызывающего объекта). |
toSource |
Возвращает строку исходного кода функции. Переопределяет метод |
toString |
Возвращает строку исходного кода функции. Переопределяет
метод |
valueOf |
Возвращает строку исходного кода функции. Переопределяет
метод |
Эта функция возвращает строку, содержащую форматированное представление чисел с заполнением ведущими нулями.
// Эта функция возвращает строку, с заполнением ведущими нулями
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"
Вы можете определить, существует ли функция, сравнивая имя функции с null
. В этом примере func1
вызывается, если функция noFunc
не существует; иначе вызывается func2
.
Заметьте, что необходимо window-имя при ссылке на функцию с именем noFunc
.
if (window.noFunc == null)
func1()
else func2()
Здесь создаются обработчики событий
onFocus
и
onBlur
для фрэйма. Этот
код находится в том же файле, в котором содержится тэг FRAMESET.
Обратите внимание, что это единственный способ создания обработчиков событий
onFocus
и
onBlur
для фрэйма,
поскольку Вы не можете специфицировать обработчики событий в тэге FRAME.
frames[0].onFocus = new Function("document.bgColor='antiquewhite'")
frames[0].onBlur = new Function("document.bgColor='lightgrey'")
Эта возможность отсутствует спецификации ECMA, соответствующей JavaScript 1.3, но ожидается в следующей её версии.
Позволяет применять метод одного объекта в контексте другого объекта (вызывающего объекта).
apply(thisArg[, argArray])
thisArg | |
argArray |
Вы можете назначить другой объект this
при вызове существующей функции. this
ссылается на текущий объект, вызывающий объект. С помощью apply
Вы можете написать метод один раз и затем наследовать его в другом объекте без необходимости переписывать метод для нового объекта.
apply
очень похож на call
, за
исключением поддерживаемых типов аргументов. Вы можете использовать массив
аргументов вместо именованного набора параметров. С помощью 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");
Массив из аргументов, передаваемых функции.
| |
JavaScript 1.2: добавлено свойство
JavaScript 1.3: не рекомендуется свойство
JavaScript 1.4: не рекомендуются | |
Массив arguments
это
локальная переменная, доступная внутри всех объектов функции; arguments
больше не используется в качестве свойства Function
.
Вы можете обращаться к аргументам функции внутри функции через использование
массива arguments
. Этот
массив содержит вход для каждого аргумента, передаваемого функции. Например,
если функции передаются три аргумента, Вы можете обращаться к этим аргументам так:
arguments[0]
arguments[1]
arguments[2]
Массив arguments
доступен только внутри тела функции. Попытка получить доступ к массиву arguments
за пределами объявления функции приводит к ошибке.
Вы можете использовать массив arguments
при вызове функции с большим количеством аргументов, чем формально объявлено.
Эта техника используется в функциях, которым может передаваться непостоянное
количество аргументов. Можно использовать arguments.length
для определения количества аргументов, переданных функции, а затем обработать
каждый аргумент с помощью массива arguments. (Чтобы
определить количество аргументов, объявленных при определении функции,
используйте свойство Function.length
.)
arguments
имеет следующие свойства:
Свойство |
Описание |
---|---|
Специфицирует имя функции, которая вызвала выполняемую в данный момент функцию. (Не рекомендуется использовать). | |
Помимо использования в качестве локальной переменной, массив arguments
является также свойством объекта Function
и может иметь перед собой имя функции. Например, если функции myFunc
передаются три аргумента с именами arg1
, arg2
и arg3
, Вы можете
обращаться к этим аргументам так:
myFunc.arguments[0]
myFunc.arguments[1]
myFunc.arguments[2]
Следующие возможности из JavaScript 1.1 и JavaScript 1.2 были удалены:
arguments
.
Например, если функция myFunc
имеет локальную переменную с именем myLocalVar
,
Вы можете обратиться к этой переменной: arguments.myLocalVar
.arguments
.
Например, если функция myFunc
имеет два аргумента с именами arg1
и arg2
,
Вы можете обратиться к этим аргументам: arguments.arg1
и arguments.arg2
. (Вы
можете также обратиться к ним arguments[0]
и arguments[1]
.)Здесь определена функция, соединяющая несколько строк. Единственным формальным аргументом этой функции является строка, специфицирующая символы, разделяющие объединяемые элементы. Функция определяется так:
Function
myConcat(separator) {
result="" // инициализация списка
// iterate through 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")
Здесь определена функция, создающая HTML-списки. Единственным формальным аргументом этой функции является строка, которая будет "U", если список неупорядоченный (bulleted), или "O", если это упорядоченный/нумерованный список. Функция определяется так:
Function
list(type) {
document.write("<" + type + "L>") // начало списка
// итерация по аргументам
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>
В серверном JavaScript Вы можете отобразить тот же вывод путём вызова функции
write
вместо document.write
.
Специфицирует тело выполняемой в данный момент функции.
Локальная
переменная | |
JavaScript 1.4: | |
arguments.callee
это свойство локальной переменной arguments
,
доступной внутри всех объектов функции; arguments.callee
больше не используется как свойство в Function
.
Свойство callee
доступно только внутри тела функции.
Ключевое слово this
не
ссылается на выполняемую в данный момент функцию. Используйте свойство callee
для обращения к функции внутри тела функции.
Эта функция возвращает значение вызова свойства callee.
Function
myFunc() {
return arguments.call
ee
}
Возвращается следующее значение:
Function myFunc() { return arguments.callee; }
Специфицирует имя функции, которая вызвала выполняемую в данный момент функцию.
|
caller
больше не используется.
Свойство caller
доступно только внутри тела функции.
Если выполняемая в данный момент функция была вызвана с верхнего уровня
программы JavaScript, caller
имеет значение null
.
Ключевое слово this
не
ссылается на выполняемую в данный момент функцию, поэтому Вы обязаны обращаться
к функциям и к объектам Function
по имени, даже в теле функции.
Свойство caller
это ссылка на вызывающую функцию, поэтому:
FunctionName.toString
.
То есть - декомпилированную каноническую исходную форму функции.
Проверяется значение свойства caller
функции:
Function myFunc() {
if (arguments.caller == null) {
return ("Функция была вызвана с верхнего
уровня!")
} else return ("this Function's caller was " + arguments.caller)
}
Специфицирует количество аргументов, передаваемых функции.
Локальная
переменная | |
JavaScript 1.4: | |
arguments.length
это свойство локальной переменной arguments
,
доступной внутри всех объектов функции; arguments.length
как свойство в Function
больше не используется.
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
больше не используется и заменена на свойство length
.
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
.
Этой возможности нет в спецификации ECMA, соответствующей JavaScript 1.3, но ожидается её появление в следующей версии.
Позволяет вызывать (выполнять) метод одного объекта в контексте другого объекта (вызывающего объекта).
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
.
Значение, на основе которого создаются экземпляры определённого класса. Каждый
объект, который может быть создан путём вызова функции constructor
, имеет
ассоциированное свойство prototype
.
Вы можете добавлять новые свойства и методы в существующий класс, добавляя их к
прототипу, ассоциированному с функцией constructor
данного класса. Синтаксис добавления нового свойства или метода таков:
fun |
Имя объекта функции |
name | |
value |
Если Вы добавляете свойство к прототипу объекта, все объекты, создаваемые
функцией constructor
этого объекта будут иметь это новое свойство, даже если
объекты существовали до создания нового свойства. Например, предположим, мы имеем такие операторы:
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".
Эта возможность отсутствует в спецификации ECMA, которая соответствует JavaScript 1.3, но ожидается её появление в следующей версии.
Возвращает строку исходного кода функции.
toSource
()
Метод toSource
возвращает следующие значения:
Function
метод toSource
возвращает следующую строку, означающую, что исходный код недоступен: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; }
Возвращает строку исходного кода функции.
valueOf()
Метод valueOf
возвращает следующие значения:
Function
метод valueOf
возвращает следующую строку, означающую, что исходный код недоступен:toSource
возвращает исходный код JavaScript, который определяет объект как строку. Этот метод эквивалентен методу toString
функции.Этот метод обычно вызывается внутренне в JavaScript, а не явным кодом.
Function.toString
,
Object.valueOf
.
Copyright © 2000
Дата последнего обновления: 28 сентября 2000 г.