Artem Gorev

Мой дорогой дневничок


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

Синтаксис

Способов объявления функций в JavaScript предостаточно, начнем с самого “старого”.

function myAwesomeFunction(foo) {
	return foo;
} 

myAwesomeFunction - имя нашей функции. foo - имя входной переменной. Ключевое слово return используется для прерывания выполнения функции и возвращения значения из функции. В текущем случаем возвращается значение переменной foo.

Анонимные функции

В данном примере объявляется анонимная функция без указания имени и присваевается переменной.

const f1 = function() {
	// …
};

Анонимные функции хорошо использовать тогда когда их имя не нужно, а такие ситуации бывают например когда в другую функцию надо передать свою функцию. Например.

function f(g) {
  return g();
} 

let g = function() { console.log(5) };   
f(g);

Стрелочные функции

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

let sum = (a,b) => a + b;  

Стрелочные функции так же могут быть многострочными

let sum = (a, b) => {
	console.log(‘sum of a, b');
	return a + b;
} 

Параметры

Функция может принимать ноль или более параметров. Начиная с ES6, функции могут принимать начальные значения для параметров. Они будут использоваться если функция будет вызвана без параметров.

let sayHi = (message = “World") => {
	console.log(`Hello ${message}`);
};

В результате функцию можно вызвать двумя способами:

sayHi(“Anna”); // -> Hello Anna
sayHi(); // -> Hello World

Можно обернуть все аргументы в массив и использовать оператор расширения для передачи их в функцию.

let sum = (a,b,c) => a + b + c;
let values = [1,2,3];
sum(…values);	// -> 6 

Кроме этого можно еще воспользоваться деструктаритзацией при определение параметров функции.

const f = ({name = ‘Artem', city = ‘Moscow’}) = {
	return `Hello ${name}` from ${city}`;
};

f({name: “Jimmy”, city: “London"});

Возвращаемое значение

Как мы уже разобрались, ключевое слово return прерывает выполнение функции и возвращает единственное значение. Если оно не будет вызвано то после выполнения блок действий, функция вернет undefined. Иногда нужно вернуть больше чем одно значение. Для таких случаев отлично помогает деструктаризация. Функция может вернуть массив или объект, а вызывающая сторона сможет легко их разобрать. Рассмотрим примеры.

let f1 = () => [’Artem’, 20, ‘Moscow’];
const [name, age, city] = f1();  
let f1 = () => {name: ’Artem’, age: 20, city: ‘Moscow’};
const [name, ge, city} = f1();  

Вложенные функции

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

const f1 = () => {
	const nestedF = () => {};
	nestedF();
};

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

Ключевое слово this

Когда вы создаете методы объекта, нужно ссылаться на переменные объекта.

const test = {
  prop: 42,
  func: function() {
    return this.prop;
  },
};

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

В следующей статье…

В следующей статье мы окунемся в объектно-ориентированное программирование и рассмотрим прототипы.