Вопросы на собеседовании по JavaScript # 2: Что такое стрелочные функции и в чем разница между обычными функциями и стрелочными функциями?

Вопросы на собеседовании по JavaScript # 2

Что такое стрелочные функции и в чем разница между обычными функциями и стрелочными функциями?

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

Начнем с того, как выглядят обычные функции.

Обычные функции

// Regular function expression
function multiply(x,y){
  return x * y;
}
multiply(3,5) // Call the function
15

Как видите, мы определили нашу функцию как multiply и передали параметры как x и y и вернули x * y.

Давайте посмотрим, как мы можем написать эту функцию внутри стрелочных функций.

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

// Declaring the multiply function with arrow function
const multiply = (x,y) => x*y
multiply(3,5) // Call the function
15

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

Давайте подробнее рассмотрим синтаксис нашей стрелочной функции:

const functionName = (argument1, argument2, ...argumentN) => {
  return (
    // write your statements here with parameters
    argument1 * argument2 // as our first example
  )
}

Как вы видите здесь, functionName — это имя функции стрелки.

Аргумент1, аргумент2 и аргументN — это аргументы, которые мы можем использовать в нашей стрелочной функции. Мы можем добавить столько аргументов, сколько нам нужно. То же самое мы могли бы сделать с обычными функциями.

Последней вещью между return (…) мы определяем тело нашей функции.

Мы также можем упростить стрелочную функцию, если у нас есть один оператор в теле функции, как показано ниже:

const functionName = (argument1,argument2) => argument1 * argument2}

Пример 1. Стрелочные функции без аргументов

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

const logHelloWorld = () => console.log('Hello World! 🌎')
logHelloWorld();
// Hello World! 🌎

Пример 2: Стрелочная функция с одним аргументом.

const logNumber = number => console.log(number)
logNumber(42)
// 42

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

Пример 3. Функции многострочных стрелок

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

const multiply = (x,y) => {
  console.log(x)
  console.log(y)
  return (
    x*y
  )
}
multiply(4,2)
// 4
// 2
// 8

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

Пример 4. Выражения со стрелочными функциями

const isBiggerThan100 = (number) => number > 100 ? true : false;
isBiggerThan100(42) 
// false

Как видите, мы создали функцию и использовали тернарный оператор, чтобы проверить, больше ли число 100, если оно возвращает true, в противном случае возвращает false.

Привязка аргументов в стрелочных функциях

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

function testArguments() {
    console.log(arguments)
}
testArguments(1,2,3)
// Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

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

const testArguments = () => {
    console.log(arguments)
}
testArguments(1,2,3)
// Uncaught ReferenceError: arguments is not defined

Когда мы попытаемся записать здесь аргументы, мы получим ReferenceError.

Есть способ добиться этого с помощью синтаксиса распространения.

const testArguments = (...n) => {
    console.log(n)
}
testArguments(1,2,3)
// [1, 2, 3]

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

Использование этого ключевого слова в стрелочных функциях

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

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

function Person() {
    this.name = 'Jack',
    this.age = 25,
    this.sayHello = function () {
      // this is accessible
      console.log('Hello', this.name);
      function innerFunction() {
        // this refers to the global object
        console.log(this.age);
        console.log(this);
      }
      innerFunction(); 
   }
}
let x = new Person();
x.sayHello()
// Hello Jack
// undefined
// Window {window: Window, self: Window, document: document, name: '', location: Location, …}

Как вы видите, наша функция sayHello правильно записывает this.name, но когда мы пытаемся получить доступ к this.age, мы не можем использовать age, потому что он ссылается на саму innerFunction .

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

unction Person() {
    this.name = 'Jack',
    this.age = 25,
    this.sayHello = function () {
      // this is accessible
      console.log('Hello', this.name);
      const innerFunction = () => {
        // this refers to the global object
        console.log(this.age); // 25
        console.log(this); // References Person 
      }
      innerFunction(); 
   }
}
let x = new Person();
x.sayHello()
// Hello Jack
// 25
// Person {name: 'Jack', age: 25, sayHello: ƒ}

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

Вот и все :)

Если вы нашли эту статью полезной, вы можете получить доступ к похожим, подписавшись на Medium-членство по моей реферальной ссылке

Подпишитесь на меня в Твиттере

Удачного кодирования!

Мелих

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.