Ядро JavaScript 1.5. Справочник

       

Function


xxx Надеюсь, что я удалил все примеры с клиентской спецификой из этого файла.

Специфицирует строку кода JavaScript, компилируемого как функция.

Объект ядра

Реализован в

JavaScript 1.1, NES 2.0

JavaScript 1.2: добавлены свойства , ; добавлена возможность вложения функций.

JavaScript 1.3: добавлены методы ,

и ; не рекомендуется использовать свойство .

JavaScript 1.4: не рекомендуются свойства , ,

и (arguments

остаётся локальной переменной функции, а не свойством в Function).

Версия ECMA


ECMA-262


 
Создание


Конструктор Function:

new Function ([arg1[, arg2[, ... argN]],] FunctionBody)

 

Оператор Function (см. ):

Function name([param[, param[, ... param]]]) {
   операторы

}

Параметры

arg1, arg2, ... argN

Имена, используемые функцией в качестве имён формальных аргументов. Каждый обязан быть строкой - правильным идентификатором JavaScript; например "x" или "theValue".

FunctionBody

Строка операторов JavaScript, образующих определение функции.

nameИмя функции.

param

Имя аргумента, передаваемого функции. Функция может иметь до 255 аргументов.

statementsОператоры, образующие тело функции.

Описание

Function-объекты, созданные конструктором Function, вычисляются каждый раз, когда используются. Это менее эффективно, чем объявление функции и вызов её в Вашем коде, поскольку объявленные функции компилируются.

Чтобы возвратить значение, функция обязана содержать оператор , специфицирующий возвращаемое значение.

Все параметры передаются функции по значению; значение передаётся функции, но, если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции. Однако, если Вы передаёте функции объект в качестве параметра и функция изменяет свойства объекта, это изменение видно вне функции, как показано в следующем примере:

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. См. .

Специфицирование аргументов в конструкторе 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, но есть и отличия:

    Если Вы присваиваете функцию переменной, используя 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.

    Следующий код присваивает функцию обработчику события   для 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, Вы можете использовать её как функцию, и она будет конвертировать объект в функцию:

    window.onFocus()

    Обработчики событий не принимают аргументов, поэтому Вы не можете объявлять аргументы для обработчика события в конструкторе Function. Например, Вы не можете вызвать функцию multiply путём установки свойства onclick

    кнопки таким образом:

    document.form1.button1.onclick=multFun(5,10)

    Обратная Совместимость

    JavaScript 1.1 и более ранние версии.

    Вы не можете вкладывать оператор функции в другой оператор или в себя самого.

    Свойства. Резюме.

    Свойство

    Описание

    Массив аргументов, передаваемых функции.

    Специфицирует тело выполняемой в данный момент функции.

    Специфицирует имя функции, которая вызвала выполняемую в данный момент функцию.

    Специфицирует количество аргументов, передаваемых функции.

    Специфицирует количество аргументов, ожидаемых функцией.

    Специфицирует функцию, которая создаёт прототип объекта.

    Специфицирует количество аргументов, ожидаемых функцией.

    Позволяет добавлять свойства объекту Function.


    Метод. Резюме.

    Метод

    Описание

    Позволяет применять метод одного объекта в контексте другого объекта (вызывающего объекта).

    Позволяет вызывать (выполнять) метод другого объекта в контексте другого объекта (вызывающего объекта).

    Возвращает строку исходного кода функции. Переопределяет метод .

    Возвращает строку исходного кода функции. Переопределяет метод .

    Возвращает строку исходного кода функции. Переопределяет метод .


    Примеры

    Пример 1.

    Эта функция возвращает строку, содержащую форматированное представление чисел с заполнением ведущими нулями.

    // Эта функция возвращает строку, с заполнением ведущими нулями

    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"

     

    Пример 2.

    Вы можете определить, существует ли функция, сравнивая имя функции с null. В этом примере func1

    вызывается, если функция noFunc не существует; иначе вызывается func2. Заметьте, что необходимо window-имя при ссылке на функцию с именем noFunc.

    if (window.noFunc == null)

       func1()

    else func2()

     

    Пример 3.

    Здесь создаются обработчики событий и для фрэйма. Этот код находится в том же файле, в котором содержится тэг FRAMESET. Обратите внимание, что это единственный способ создания обработчиков событий и для фрэйма, поскольку Вы не можете специфицировать обработчики событий в тэге FRAME.

    frames[0].onFocus = new Function("document.bgColor='antiquewhite'")

    frames[0].onBlur = new Function("document.bgColor='lightgrey'")

    apply">


    Операция function определяет анонимную функцию внутри выражения.

    Реализована вJavaScript 1.5


    Синтаксис

    {var | const} variableName = function(parameters) {functionBody};


    Описание

    Следующие примеры показывают использование операции function.

    Этот пример объявляет безымянную функцию внутри выражения. В переменную x устанавливается функция, возвращающая квадрат аргумента:

    var x = function(y) {return y*y};

    Этот пример объявляет массив a как массив из трёх функций:

    var a = [function(y) {return y}, function y {return y*y}, function (y) [return y*y*y}];

    Для этого массива, a[0](5) возвращает 5, a[1](5) возвращает 25, a[2](5) возвращает 125.




    Объявляет функцию со специфицированными параметрами. В качестве параметров принимаются строки, числа и объекты.

    Реализован в

    JavaScript 1.0, NES 2.0

    JavaScript 1.5, NES 6.0: добавлено объявление условной функции (расширение Netscape).

    Версия ECMA

    ECMA-262


    Синтаксис

    function name([param] [, param] [..., param]) {

    statements

    }

    Вы можете также определять функции с помощью конструктора и оператора ; см. и .


    Параметры

    name

    Имя функции.

    param

    Имя аргумента, передаваемого функции. Функция может иметь не более 255 аргументов.

    statements

    Операторы, образующие тело функции.


    Описание

    Чтобы возвращать значение, функция обязана иметь оператор , который специфицирует возвращаемое значение.

    Функция, созданная с помощью оператора function, является объектом Function и содержит все свойства, методы и поведение объектов Function. См. в  детальную информацию о функциях.

    Netscape поддерживает условное объявление функций, когда функция может быть объявлена на базе вычисления некоторого условия. Если условие true, функция объявляется. Иначе - не объявляется.

    Функция может быть также объявлена внутри выражения. В этом случае функция обычно анонимна.


    Примеры

    Этот код объявляет функцию, которая возвращает общую сумму от продаж в долларах, если задано количество проданных единиц продуктов a, b и c.

    function calc_sales(units_a, units_b, units_c) {

       return units_a*79 + units_b*129 + units_c*699

    }

    В следующем скрипте функция one всегда объявляется. Функция zero объявляется, поскольку 'if(1)' вычисляется в true:

    <SCRIPT language="JavaScript1.5">

    <!--

    function one()

       document.writeln("This is one.");

       if (1)

          function zero()

          {

             document.writeln("This is zero.");

          }

    }

    </SCRIPT>

    Однако, если скрипт изменяется таким образом, что условие становится 'if (0)', функция zero не объявляется и не может быть вызвана.


    См. также

    , .



    Содержание раздела