Объект Function ECMAScript (класс)
- Предыдущая страница Объект arguments
- Следующая страница Клوزуры (closure)
Функции в ECMAScript на самом деле являются полными объектами.
Объект Function (класс)
Одной из наиболее интересных особенностей ECMAScript может быть то, что функции на самом деле являются полными объектами.
Класс Function может представлять любую функцию, определенную разработчиком.
Синтаксис создания функции с помощью класса Function таков:
var function_name = new function()arg1, arg2, ... , argN, function_body)
В этом формате каждый arg У них один параметр, последний параметр - это тело функции (код, который нужно выполнить). Эти параметры должны быть строками.
Помните эту функцию?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
Ещё можно определить её так:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage)");
Хотя из-за строкового отношения это сделать несколько трудно, это помогает понять, что функции являются типом данных, указывающим на объект, и их поведение такое же, как и поведение функций, созданных с помощью Function.
Пожалуйста, посмотрите на следующий пример:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //вывод "20"
Как вы знаете, вторая функция перегружает первую функцию, так что doAdd(10) выводит "20", а не "30".
Если переписать этот блок кода в следующем виде, то концепция станет более ясной:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Пожалуйста, обратите внимание на этот код,显然, значение doAdd было изменено на указатель на другой объект. Имя функции просто указывает на ссылку на объект функции и ведёт себя так же, как и другие объекты. Даже можно сделать так, чтобы две переменные указывали на одну и ту же функцию:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //вывод "20" alsodoAdd(10); //вывод "20"
Здесь переменная doAdd определена как функция, а затем alsodoAdd объявлена как указатель на ту же функцию. Эти две переменные могут выполнять код функции и выводить одинаковый результат - "20". Таким образом, если имя функции только указывает на переменную функции, можно ли передавать функцию в качестве аргумента другой функции? Ответ положительный!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); // Вывод "20"
В примере выше callAnotherFunc() имеет два параметра - функция, которую нужно вызвать, и параметры, передаваемые этой функции. Это код передает doAdd() функции callAnotherFunc(), параметром является 10, вывод "20".
Примечание:Хотя можно создать функцию с помощью конструктора Function, лучше этого не делать, так как это значительно медленнее, чем традиционный способ. Однако все функции должны рассматриваться как экземпляры класса Function.
Свойство length объекта Function
Как уже упоминалось, функции относятся к типу данных ссылке, поэтому у них также есть свойства и методы.
Свойство length, определенное ECMAScript, указывает на количество ожидаемых аргументов функции. Например:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); // Вывод "1" alert(sayHi.length); // Вывод "0"
Функция doAdd() определяет один параметр, поэтому его length равен 1; функция sayHi() не определяет параметров, поэтому length равен 0.
Запомните, что ECMAScript может принимать любое количество аргументов (до 25), что было рассмотрено в разделе «Обзор функций». Свойство length предназначено для удобства просмотра ожидаемого количества аргументов по умолчанию.
Методы объекта Function
Объект Function также имеет методы valueOf() и toString(), которые все объекты могут использовать. Эти методы возвращают исходный код функции и особенно полезны при отладке. Например:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Следующий фрагмент кода выводит текст функции doAdd().Попробуйте сами!
- Предыдущая страница Объект arguments
- Следующая страница Клوزуры (closure)