|
|
Книги-onlineFunction Оглавление | Назад | Вперёд | Индекс FunctionСпецифицирует строку JavaScript-кода, компилируемую как функция.
Созданиеnew Function ([arg1[, arg2[, ... argN]],] functionBody) Оператор function (см. "function"): function name([param[, param[, ... param]]]) { Параметры
ОписаниеFunction-объекты, созданные конструктором Function, вычисляются каждый раз при их использовании. Это менее эффективно, чем объявление функции и вызов её внутри Вашего кода, поскольку объявленные функции компилируются. Чтобы возвращать значение, функция обязана иметь оператор return, который специфицирует возвращаемое значение. Все параметры передаются функции по значению; значение передаётся функции, но если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаёте функции объект в качестве параметра и функция изменяет свойства объекта, эти изменения видны вне функции, как показано в следующем примере: function myFunc(theObject) { Ключевое слово 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 Присвоение функции переменной конструктором Function. Предположим, Вы создаёте переменную multiply с использованием конструктора Function, как показано в предыдущем разделе: var multiply = new Function("x", "y", "return x * y") Это похоже на следующее объявление функции: function multiply(x,y) { Присвоение функции переменной с использованием конструктора Function похоже на объявление функции оператором function, но имеются и отличия:
Вложение функций. Вы можете вкладывать функции друг в друга. Вложенная функция (внутренняя) является private для содержащей её (внешней) функции:
Следующий пример демонстрирует вложение функций: function addSquares (a,b) { Если функция содержит вложенную функцию, Вы можете вызывать внешнюю функцию и специфицировать аргументы для внешней и внутренней функции: function outside(x) { Специфицирование обработчика события объектом 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" После того как Вы получили ссылку на Function-объект, Вы можете использовать его как функцию, и он будет конвертирован из объекта в функцию: window.onfocus() Обработчики событий не принимают аргументов, поэтому Вы не можете объявлять никакие аргументы в конструкторе Function для обработчика события. Например, Вы не можете вызывать функцию multiply через такую установку свойства onclick кнопки: document.form1.button1.onclick=multFun(5,10) Обратная СовместимостьJavaScript 1.1 и более ранние версии. Вы не можете вкладывать один оператор функции в другой оператор либо в самого себя. Свойства. Резюме.
Методы. Резюме.
ПримерыПример 1. Эта функция возвращает строку, содержащую отформатированное представление чисел с заполнением ведущими нулями. // Эта функция возвращает строку, заполненную ведущими нулями Следующие операторы вызывают функцию padZeros: result=padZeros(42,4) // возвращает "0042" Пример 2. Вы можете определить, существует ли функция, сравнив имя функции с null. В следующем примере func1 вызывается, если функция noFunc не существует; иначе вызывается функция func2. Заметьте, что требуется имя окна при обращении к функции noFunc. if (window.noFunc == null) Пример 3. Здесь создаётся обработчики события onFocus и onBlur для фрэйма. Этот код находится в том же файле, который содержит тэг FRAMESET. Заметьте, штаа это единственный способ создания обработчиков onFocus и onBlur для фрэйма, поскольку Вы не можете специфицировать обработчики в тэге FRAME. frames[0].onfocus = new Function("document.bgColor='antiquewhite'") applyДаёт возможность применить метод другого объекта в контексте вызывающего объекта. Синтаксисapply(thisArg[, argArray]) Параметры
ОписаниеМожно присваивать различные this-объекты при вызове существующей функции. this относится к текущему объекту, вызывающему объекту. С помощью apply Вы можете записать метод только один раз и затем наследовать его в другом объекте без необходимости повторно записывать этот метод для нового объекта. apply очень похож на call, за исключением поддерживаемых типов аргументов. Вы можете использовать массив arguments вместо именованного набора параметров. С помощью apply Вы можете использовать литерал массива, например, apply(this, [name, value]), или объект Array, например, apply(this, new Array(name, value)). Вы можете также использовать arguments
для параметра argArray. ПримерМожно использовать apply для создания цепочки конструкторов объекта, как в Java. В следующем примере конструктор объекта product определяется с двумя параметрами, name и value. Другой объект, prod_dept, инициализирует свою уникальную переменную (dept) и вызывает конструктор для product в своём конструкторе для инициализации других переменных. Здесь параметр arguments использован для всех аргументов конструктора объекта product. function product(name, value){ function prod_dept(name, value, dept){ prod_dept.prototype = new product(); // поскольку 5 меньше 100, значение устанавливается // поскольку 5000 больше 1000, значение будет 999 См. такжеFunction.callargumentsМассив, соответствующий аргументам, передаваемым функции.
ОписаниеВы можете обращаться к аргументам функции, используя массив arguments. Этот массив содержит вхождение для каждого аргумента, передаваемого функции. Например, если функции передаются три аргумента, Вы можете обратиться к аргументам так: arguments[0] Массиву arguments может предшествовать также имя функции: myFunc.arguments[0] Массив arguments доступен только внутри тела функции. Попытка получить доступ к массиву arguments вне объявления функции приведёт к ошибке. Вы можете использовать массив arguments при вызове функции с бо́льшим количеством аргументов, чем она принимает по формальному объявлению. Эта техника используется для тех функций, которым можно передавать переменное количество аргументов. Вы можете использовать arguments.length для определения количества аргументов, передаваемых функции, и последующей обработки каждого аргумента с использованием массива arguments. (Для определения количества аргументов, объявленных при определении функции, используйте свойство Function.length.) Массив arguments имеет следующие свойства:
Обратная СовместимостьJavaScript 1.1 и 1.2. Следующие возможности JavaScript 1.1 и JavaScript 1.2 удалены:
ПримерыПример 1. Здесь определена функция, выполняющая конкатенацию/объединение нескольких строк. Единственным формальным аргументом функции является строка, специфицирующая символ-разделитель объединяемых строк. Функция определена так: function myConcat(separator) { Вы можете передать этой функции любое количеств аргументов, и она создаст список из всех аргументов как элементов списка. // возвращает "red, orange, blue, " // возвращает "elephant; giraffe; lion; cheetah;" // возвращает "sage. basil. oregano. pepper. parsley. " Пример 2. Определяется функция, создающая HTML-списки. Единственным формальным аргументом этой функции является строка, которая содержит "U", если это неупорядоченный список (bulleted), или "O", если это упорядоченный список (numbered). Функция определена так: function list(type) { Вы можете передать этой функции любое количество аргументов, и она отобразит каждый аргумент как элемент списка указанного типа. Например, следующий вызов функции list("U", "One", "Two", "Three") <UL> arguments.calleeСпецифицирует тело исполняемой в данный момент функции. ОписаниеСвойство callee доступно только в теле функции. Ключевое слово this не относится к исполняемой в данный момент функции. Используйте свойство callee для обращения к функции в теле этой функции. ПримерыСледующая функция возвращает значение свойства callee этой функции. function myFunc() { Возвращается следующее значение: function myFunc() { return arguments.callee; } См. такжеFunction.argumentsarguments.callerСпецифицирует имя функции, которая вызвала исполняемую в данный момент функцию. Описаниеcaller больше не используется. Свойство caller доступно только в теле функции. Если исполняемая в данный момент функция была вызвана с верхнего уровня программы JavaScript, значение caller будет null. Ключевое слово this не относится к исполняемой в данный момент функции, поэтому Вы обязаны к функциям и объектам Function по имени, даже в теле функции. Свойство caller является ссылкой на вызывающую функцию, поэтому,
ПримерыСледующий код проверяет значение свойства caller функции: function myFunc() { См. такжеFunction.argumentsarguments.lengthСпецифицирует количество аргументов, передаваемых функции. Описаниеarguments.length выдаёт количество аргументов, реально переданных функции. В отличие от него, свойство Function.length указывает, сколько аргументов функция ожидает. ПримерИспользование Function.length и arguments.length. function addNumbers(x,y){ Если Вы передаёте этой функции больше двух аргументов, она возвращает 0: result=addNumbers(3,4,5) // возвращает 0 См. такжеFunction.argumentsarityСпецифицирует количество аргументов, ожидаемых функцией. Описаниеarity является внешним относительно функции и указывает, какое количество аргументов функция ожидает. В отличие от него, arguments.length предоставляет количество аргументов, реально переданных функции. ПримерИспользование arity и arguments.length. function addNumbers(x,y){ Если Вы передаёте этой функции более двух аргументов, она возвращает 0: result=addNumbers(3,4,5) // возвращает 0 См. такжеarguments.length, Function.lengthcallПозволяет вызывать (выполнять) метод другого объекта в контексте данного (вызывающего) объекта. Синтаксисcall(thisArg[, arg1[, arg2[, ...]]]) Параметры
ОписаниеВы можете присвоить разные объекты this при вызове существующей функции. this ссылается на текущий (вызывающий) объект. С помощью call Вы можете записать метод однократно и затем наследовать его в другом объекте без необходимости записывать его ещё раз для нового объекта. ПримерыВы можете использовать call для создания цепочки конструкторов объектов, как в Java. В следующем примере конструктор объекта product определён с двумя параметрами, name и value. Другой объект, prod_dept, инициализирует свою уникальную переменную (dept) и вызывает конструктор объекта product в своём конструкторе для инициализации других переменных. function product(name, value){ function prod_dept(name, value, dept){ prod_dept.prototype = new product(); // поскольку 5 меньше 100, значение устанавливается // поскольку 5000 больше 1000, значение будет 999 См. такжеFunction.applyconstructorСпецифицирует функцию, которая создаёт прототип объекта. Заметьте, что значением этого свойства является ссылка на функцию, а не строка с именем функции. ОписаниеСм. Object.constructor. lengthСпецифицирует количество аргументов, ожидаемое функцией. Описаниеlength является внешним относительно функции и указывает, сколько аргументов функция ожидает. В противоположность ему, arguments.length является локальным относительно функции и представляет количество аргументов, реально переданных функции. ПримерСм. пример для arguments.length. См. такжеarguments.lengthprototypeЗначение, из которого создаются экземпляры определённого класса. Каждый объект, который может быть создан вызовом конструктора функции, имеет ассоциированное свойство prototype. ОписаниеВы можете добавлять в существующий класс новые свойства или методы, добавляя их в прототип, ассоциированный с конструктором данного класса. Синтаксис добавления нового свойства или метода таков: fun.prototype.name = value
Если Вы добавляете свойство в прототип объекта, то все объекты, созданные этой функцией-конструктором этих объектов, будут иметь это новое свойство, даже если объекты существовали до создания нового свойства. Например, предположим, имеются такие операторы: var array1 = new Array(); После установки свойства в прототипе все объекты, созданные с помощью Array, будут иметь это свойство: anotherArray=new Array() ПримерЗдесь создаётся метод str_rep и используется оператор String.prototype.rep = str_rep для добавления метода всем объектам String. Все объекты, созданные с помощью new String(), имеют теперь и этот метод, хотя объекты уже были созданы раньше. Затем создаётся альтернативный метод и добавляется к одному из объектов String через использование оператора s1.rep = fake_rep. Метод str_rep других String-объектов не изменяется. var s1 = new String("a") // Создаётся метод repeat-string-N-times для всех объектов String String.prototype.rep = str_rep s1a=s1.rep(3) // возвращает "aaa" // Создаётся альтернативный метод и присваивается только одной String-переменной s1.rep = fake_rep Функция из этого примера работает также со String-объектами, созданными без использования конструктора String. Следующий код возвращает "zzz". "z".rep(3) toSourceВозвращает строку, представляющую исходный код функции. СинтаксисtoSource() ПараметрыОписаниеМетод toSource возвращает следующие значения:
Этот метод обычно вызывается JavaScript внутренне, а не явно в коде. Вы можете вызывать toSource при отладке для проверки содержимого объекта. См. такжеFunction.toString, Object.valueOftoStringВозвращает строку, представляющую исходный код функции. Синтаксис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) { 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.toStringvalueOfВозвращает строку, представляющую исходный код функции. СинтаксисvalueOf() ПараметрыОписаниеМетод valueOf возвращает следующие значения:
Этот метод обычно вызывается JavaScript внутренне, а не явно в коде. См. такжеFunction.toString, Object.valueOf Оглавление | Назад | Вперёд | ИндексДата последнего обновления: 28 мая 1999 года. Внимание! Если у вас не получилось найти нужную информацию, используйте рубрикатор или воспользуйтесь поиском . книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать |
|