Функции JavaScript: методы объявления функций

Функции имеют основополагающее значение для JavaScript. Понимание функций в JavaScript — это самое важное оружие в вашем арсенале. Самый важный факт функций заключается в том, что в JavaScript они являются первоклассными объектами. Они рассматриваются как любой другой объект JavaScript. Как и другие типы данных JavaScript, на них могут ссылаться переменные, объявленные с помощью литералов и даже могут быть переданы как параметры функции.
Как и любой другой объект в JavaScript, функции имеют следующие возможности:
• Они могут быть созданы посредством литералов
• Они могут быть назначены для переменных, записей в массиве и свойств других объектов
• Они могут передаваться в качестве аргументов функциям
• Они могут быть возвращены как значения из функций
• Они могут обладать свойствами, которые могут быть динамически создаваться и назначаться

Функциональный литерал

Одним из наиболее важных понятий JavaScript является то, что функции являются основной программной единицей. Функции — это фрагменты, в которые вы будете обертывать весь свой код, следовательно, они придадут вашим приложениям структуру.
Функции JavaScript объявляются с использованием литерала функции.
Функциональные литералы состоят из следующих четырех частей:
• Ключевое слово function.
• Необязательное имя, которое, если указано, должно быть допустимым идентификатором JavaScript.
• Список имен параметров, заключенных в круглые скобки. Если для функции нет параметров, вам необходимо указать пустые круглые скобки.
• Тело функции как ряд операторов JavaScript, заключенных в фигурные скобки.

Объявление функции

Ниже приведено очень тривиальный пример, демонстрирующий все компоненты объявления функции:

function add(a,b){
    return a+b;
}
c = add(1,2);
console.log(c); //prints 3

Объявление начинается с ключевого слова function, за которым следует имя функции. Имя функции необязательно. Если функции не присвоено имя, она называется анонимной. Мы позже посмотрим, как используются анонимные функции. Третья часть — это набор параметров функции, заключенных в круглые скобки. В круглых скобках находится набор от нуля параметров и более, разделенных запятыми. Эти параметры будут определены как переменные в функции, и вместо того, чтобы быть инициализированными к неопределенным, они будут инициализированы к аргументам, указанным при вызове функции. Четвертая часть представляет собой набор утверждений, завернутых в фигурные скобки. Эти утверждения являются телом функции. Они выполняются при вызове функции.

Этот метод объявления функции также известен как функция-инструкция. Когда вы объявляете такие функции, содержимое функции компилируется и создается объект с тем же именем, что и функция.
Другим способом объявления функции является функциональное выражение

var add = function(a,b){
    return a+b;
}
c = add(1,2);
console.log(c); //prints 3

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

var facto = function factorial(n) {
    if (n <= 1)
       return 1;
    return n * factorial(n - 1);
};
console.log(facto(3)); //prints 6

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

Наконец, вы можете создавать самовызывающиеся функциональные выражения (мы обсудим их позже):

(function sayHello() {
    console.log("hello!");
})();

После определения функция может быть вызвана в других функциях JavaScript. После того, как тело функции выполнено, вызвавший код (выполненной функции) продолжает выполняться. Вы также можете передать функцию в качестве параметра другой функции:

function changeCase(val) {
    return val.toUpperCase();
}
function demofunc(a, passfunction) {
    console.log(passfunction(a));
}
demofunc("smallcase", changeCase);

В предыдущем примере мы вызываем функцию demofunc() с двумя параметрами. Первый параметр — это строка, которую мы хотим преобразовать в верхний регистр, а второй — ссылка на функцию changeCase(). В demofunc() мы вызываем функцию changeCase() через ссылку, переданную аргументу passfunction. Здесь мы передаем ссылку на функцию как аргумент другой функции. Эта мощная концепция будет подробно в следующих статьях.

Функция может вернуть или не вернуть значение. В предыдущих примерах мы видели, что функция add возвращает значение вызывающему коду. Помимо возврата значения в конце функции, вызов return явно позволяет вам условно вернуть из функции:

var looper = function(x){
    if (x%5===0) {
        return;
    }
    console.log(x)
}
for(var i=1;i<10;i++){
    looper(i);
}

Этот фрагмент кода печатает 1, 2, 3, 4, 6, 7, 8 и 9, а не 5. Когда условие if (x% 5 === 0) оценивается как true, код просто выходит из функции и остальная часть кода не выполняется.

Функции как данные

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

var say = console.log;
say("I can also say things");

В предыдущем примере мы присвоили знакомой функции console.log() переменной say. Любая функция может быть назначена переменной, как показано в предыдущем примере. Добавление скобок к переменной вызовет его. Более того, вы можете передавать функции в другие функции в качестве параметров. Внимательно изучите следующий пример и введите его в JS Bin:

var validateDataForAge = function(data) {
  person = data();
  console.log(person);
  if (person.age <1 || person.age > 99){
    return true;
  }else{
    return false;
  }
};

var errorHandlerForAge = function(error) {
  console.log("Error while processing age");
};

function parseRequest(data,validateData,errorHandler) {
  var error = validateData(data);
  if (!error) {
    console.log("no errors");
  } else {
    errorHandler();
  }
}

var generateDataForScientist = function() {
  return {
    name: "Albert Einstein",
    age : Math.floor(Math.random() * (100 - 1)) + 1,
  };
};

var generateDataForComposer = function() {
  return {
    name: "J S Bach",
    age : Math.floor(Math.random() * (100 - 1)) + 1,
  };
};
//parse request
parseRequest(generateDataForScientist, validateDataForAge, errorHandlerForAge);
parseRequest(generateDataForComposer, validateDataForAge, errorHandlerForAge);

В этом примере мы передаем функции как параметр функцию parseRequest(). Мы передаем разные функции для двух разных вызовов: generateDataForScientist и generateDataForComposers, в то время как остальные две функции остаются неизменными. Вы можете заметить, что мы определили общий parseRequest(). В качестве аргументов используются три функции, которые отвечают за сшивание специфики: данные, валидатор и обработчик ошибок. Функция parseRequest() полностью расширяема и настраивается, и поскольку она будет вызываться каждым запросом, есть единственная чистая точка отладки. Я уверен, что вы начали представлять невероятную мощь, предоставляемую функциями JavaScript.

 

Написать комментарий

Ваш Email не будет опубликован

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