понедельник, 7 ноября 2016 г.

1.8 Функции

(Из книги "Говоря на языке JavaScript").

Один из способов определения функции (ее декларация)  выглядит так:
 
function add(param1, param2) {
    return param1 + param2;
}
 
Этот код определяет функцию add, которая получает два параметра (param1 и param2) и возвращает их сумму. А вот как вызвать эту функцию:
 
add(6, 1)     // Вернет 7.
add('a', 'b') // Вернет 'ab'.
 
Другой способ создать функцию  add() - присвоить ее описание переменной add:
 
var add = function (param1, param2) {
    return param1 + param2;
};
 
Функции могут производить некое значение и передаваться в качестве параметров другим функциям:
 
someOtherFunction(function (p1, p2) { ... });

"Возвышающиеся" декларации функций

Определения функций обрабатываются раньше, чем остальной код. Это позволяет вызывать их в коде раньше, чем декларировать:
 
function foo() {
    bar();  // OK, bar is hoisted
    function bar() {
        ...
    }
}
 
Обратите внимание, что такими же свойствами обладает декларирование переменных (см. "Возвышающиеся" переменные), но не обращение к ним:
function foo() {
    bar();  // Not OK, bar is still undefined
    var bar = function () {
        // ...
    };
}

Особая переменная arguments

Вы можете вызвать любую функцию в JavaScript с произвольным числом аргументов. С этим проблем не будет. Это дает возможность сделать доступными все аргументы посредством особой переменной arguments. Она выглядит как массив, но не обладает методами массива:
 
function f() { return arguments }
var args = f('a', 'b', 'c');
args.length // Равно 3.
args[0]     // Аргумент с индексом 0 это 'a'

Слишком много или слишком мало аргументов

Давайте используем нижеследующую функцию для того, чтобы исследовать, как избыток или недостаток аргументов обрабатывается в  JavaScript (функция toArray() показана в разделе Преобразование аргументов в массив):
 
function f(x, y) {
    console.log(x, y);
    return toArray(arguments);
}
 
Дополнительные параметры функции toArray() можно проигнорировать, за исключением параметра  arguments:
 
f('a', 'b', 'c') // Выведет a b, вернет [ 'a', 'b', 'c' ].
 
Недостающие параметры получают значение undefined:
 
f('a') // Выведет a undefined, вернет [ 'a' ].
f()    // Выведет undefined undefined, вернет [].

Дополнительные параметры

Вот как можно присвоить параметрам значения по умолчанию:
 
function pair(x, y) {
    x = x || 0;  // (1)
    y = y || 0;
    return [ x, y ];
}
 
В строке (1) оператор  || возвращает x если он истинен (не null, undefined, и т.д). В противном случае ему присваивается возвращается второй операнд (0):
 
pair()     // Вернет [ 0, 0 ].
pair(3)    // Вернет [ 3, 0 ]
pair(3, 5) // Вернет [ 3, 5 ]

Принудительная арность

Арность  — количество аргументов, или операндов. Слово образовалось из названий предикатов небольшой арности (унарный — один аргумент, бинарный — два, тернарный — три).
 
Если вы хотите принудительно усилить арность (всегда передавать строго определенное количество аргументов), вы можете проверять длину массива аргументов arguments.length:
 
function pair(x, y) {
    if (arguments.length !== 2) {
        throw new Error('Need exactly 2 arguments');
    }
    ...
}

Преобразование переменной arguments в массив

Перемення arguments это не массив в строгом смысле (см. Массивоподобные объекты и общие методы). Она имеет свойство length,  вы можете обращаться к ее элементам с помощью индексов в квадратных скобках, но вы не можете удалять элементы или пользоваться методами объектов типа Array. Поэтому иногда требуется преобразовать  arguments в массив, чем и занимается нижеописанная функция (ее работа объясняется в разделе  Массивоподобные объекты и общие методы):
 
function toArray(arrayLikeObject) {
    return Array.prototype.slice.call(arrayLikeObject);
}
 

Комментариев нет:

Отправить комментарий