Стандартный способ определения функции.
Синтаксис:
function имя_функции(параметры) {
код
}
Существует и другой способ, основанный на выражении с ключевыми словами new Function. Согласно этому способу функция создается как экземпляр объекта Function:
имя_функции = new Function(["nap1",...[,"napN"], "оператор1;...[; onepaтopN]")
Названия всех параметров являются строковыми значениями. Они разделяются запятыми. Заключительная строка содержит операторы кода тела функции, разделенные точкой с запятой.
Вызов функции, определенной как экземпляр объекта Function, можно выполнить обычным способом:
имя_функции(параметры)
Рассмотрим пример.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Объект Function</title>
<script language="JavaScript">
strek=new Function("W","H","s=W*H;return s")
strek(6,8)//возвращает 48
document.write(strek(6,8))
// или
var a="s=W*H; return s"
strek=new Function("W","H", a)
strek(6,8)//возвращает 48
alert(strek(6,8))
</script>
</head>
<body>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
При любом задании функции, стандартном или с помощью ключевого слова new, автоматически создается экземпляр объекта Function, который обладает своими свойствами и методами.
arguments – массив значений параметров, переданных функции.
Индексация элементов массива производится с 0. Поскольку это массив, он имеет свойства и методы объекта Array (в частности, свойство length — длина массива).
Свойство arguments применяется в теле определения функции, когда требуется проанализировать параметры, переданные ей при вызове. Например, можно узнать, сколько в действительности было передано параметров, не являются ли их значения пустыми (0, null) и т. п. Это свойство особенно полезно при разработке универсальных библиотечных функций.
Синтаксис выражения следующий:
имя_функции.arguments
Рассмотрим пример, где функция возвращает строку, содержащую значения параметров и их общее количество, которые были указаны в вызове функции (а не в ее определении!)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Свойства объекта Function</title>
<script language="JavaScript">
function mystrug(a,b,c){
var strug=mystrug.arguments.length /*кол-во переданных параметров*/
var s=""
for(i=0;i<mystrug.arguments.length;i++){
s+=mystrug.arguments[i] + ","
}
return s+" Всего: " +strug
}
mystrug(4,"надо","Федя") //4,надо,Федя, Всего: 3
mystrug()//Всего: 0
document.write(mystrug(4,"надо","Федя"))
</script>
</head>
<body>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
length – количество параметров, указанных в определении функции. Синтаксис:
имя_функции. length
В отличие от свойства arguments, количество параметров функции можно определить в программе за пределами тела этой функции.
Рассмотрим пример.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Свойства объекта Function</title>
<script language="JavaScript">
function mystrug(a,b,c,d){
var strug=mystrug.arguments.length /*кол-во переданных параметров*/
return "Здесь: " +strug
}
mystrug(2,4) //2
mystrug.length //4
document.write(mystrug(2,4)+" Всего: "+mystrug.length)
</script>
</head>
<body>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Свойства объекта Function</title>
<script language="JavaScript">
function myF(){
myF1()
}
function myF1(){
alert(myF1.caller)
}
myF()
</script>
</head>
<body>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Вызов функции myF() приведет к вызову функции myF1, которая выведет на экран окно с сообщением, содержащим код определения функции myF()toString() — возвращает определение функции в виде строки. Синтаксис:
имя_функции.toStrinд()Рассмотрим пример.
В окне веб-браузера это будет выглядеть ТАК.
apply([текущий_объект[, массив_параметров]])
call(текущий_объект[,пар1[, пар2[, ... , парN[]]]])
Оба метода используются для вызова функции и дают одинаковые результаты. Отличаются лишь формой представления параметров.Отличаются они лишь формой представления параметров. Как известно, функцию можно вызвать просто по имени, за которым следует список параметров в круглых скобках. Особенностью этих методов является то, что с их помощью можно вызвать функцию по ссылке на нее.
Первый параметр, демонстрирующий работу обоих методов – это ссылка на объект, который для данной функции является текущим. Для многоуровневых функций, определенных в сценарии, используется ключевое слово this, которое означает, что контекстом функции становится текущий объект(как для обычной функции). Если нет таких параметров, которые необходимо передать в функцию, в обоих методах их можно опустить.
Ссылка на объект используется, когда вызываемая функция принадлежит к функциям, которые определяются как методы пользовательского объекта.
Рассмотрим пример.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Методы объекта Function</title>
<script language="JavaScript">
/* функция-конструктор объекта car (автомобиль)*/
function car(name,model,color){
this.name=name //название
this.model=model//модель
this.color=color//цвет
this.show=showca//метод
}
/*функция, вызываемая как метод объекта car*/
function showcar(){
alert(this.name+"-"+this.model) //окно с сообщением
}
/*создание экземпляра объекта car*/
mycar=new car("Nissan", "Primera","green")
mycar.show() /*стандартный способ вывода сообщения с использованием метода show к объекту car*/
</script>
</head>
<body>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Обычный способ применения метода show к объекту car (вывод окна с сообщением) выглядит так:
mycar.show()
При этом в действительности вызывается функция showcar(), заданная для этого метода. Текущий объект рассматривается как контекст для ссылок this, указанных в теле функции.
Однако методы apply() и call() позволяют не связывать функцию showcar() с объектом mycar.Более того, в конструкторе объекта саг можно не указывать выражение, определяющее функцию showcar() в качестве метода объекта. Вместо этого можно вызвать метод showcar как объект и применить к нему метод call(), указав в качестве параметра mycar как текущий объект:
showcar.call(mycar)
С помощью метода call() можно передавать параметры, отделенные друг от друга запятыми. Если параметры определены как элементы массива, то вместо call() используется метод apple().