Sobes.tech
Junior
85
questionbank

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

AI答案

sobes.tech AI

  1. Синтаксис:
    • Обычная функция: function myFunction() { ... }
    • Стрелочная функция: () => { ... } или param => { ... }
  2. Контекст this:
    • Обычная функция: this определяется контекстом вызова.
    • Стрелочная функция: this лексически наследуется из окружающей области видимости (не имеет собственного this).
  3. Конструкторы:
    • Обычная функция: Может быть использована как конструктор (new myFunction()).
    • Стрелочная функция: Не может быть использована как конструктор.
  4. Объект arguments:
    • Обычная функция: Имеет собственный объект arguments, содержащий переданные аргументы.
    • Стрелочная функция: Не имеет собственного объекта arguments, доступ к аргументам осуществляется через rest-параметры (...args).
  5. Именованные функции:
    • Обычная функция: Может быть именованной (function myFunction() { ... }).
    • Стрелочная функция: Анонимна по умолчанию, присваивается переменной для именования (const myFunction = () => { ... }).
  6. Return Implicit (неявный возврат):
    • Обычная функция: Требует явного использования return для возврата значения (кроме простых случаев, как IIFE).
    • Стрелочная функция: При однострочном теле может неявно возвращать результат выражения без return.

Таблица сравнения:

Характеристика Обычная функция Стрелочная функция
Синтаксис function name() { ... } () => { ... }
Контекст this Динамический (контекст вызова) Лексический (родительской области)
Конструктор Да Нет
Объект arguments Да Нет (использует rest-параметры)
Именование Может быть именованной Анонимна (присваивается)
Неявный возврат Нет (обычно требуется return) Да (для однострочного тела)
// Пример обычных функций
function standardFunction() {
  console.log(this); // Зависит от контекста вызова
  console.log(arguments); // Доступен объект arguments
}

const obj = {
  method: standardFunction
};

standardFunction(); // this будет window (в браузере) или undefined (в строгом режиме)
obj.method(); // this будет obj
new standardFunction(); // this будет новый экземпляр объекта standardFunction()

// Пример стрелочных функций
const arrowFunction = () => {
  console.log(this); // Наследует this из родительской области видимости (например, Global или модуля)
  // console.log(arguments); // Ошибка, arguments недоступен
};

const outerObj = {
  outerMethod: function() {
    const innerArrowFunction = () => {
      console.log(this); // Наследует this от outerMethod (который равен outerObj)
    };
    innerArrowFunction();
  }
};

arrowFunction(); // this будет window (в браузере) или {} (в Node.js)
outerObj.outerMethod(); // this внутри innerArrowFunction будет outerObj

// Неявный возврат в стрелочной функции
const sum = (a, b) => a + b;
console.log(sum(2, 3)); // 5 (неявный возврат a + b)

// Обычная функция с явным возвратом
function multiply(a, b) {
  return a * b;
}
console.log(multiply(2, 3)); // 6

// Стрелочная функция не может быть конструктором
// new arrowFunction(); // Ошибка: TypeError: arrowFunction_1 is not a constructor