Junior
85
questionbank
В чем разница между стрелочными функциями и обычными функциями в JavaScript?
AI答案
sobes.tech AI
- Синтаксис:
- Обычная функция:
function myFunction() { ... } - Стрелочная функция:
() => { ... }илиparam => { ... }
- Обычная функция:
- Контекст
this:- Обычная функция:
thisопределяется контекстом вызова. - Стрелочная функция:
thisлексически наследуется из окружающей области видимости (не имеет собственногоthis).
- Обычная функция:
- Конструкторы:
- Обычная функция: Может быть использована как конструктор (
new myFunction()). - Стрелочная функция: Не может быть использована как конструктор.
- Обычная функция: Может быть использована как конструктор (
- Объект
arguments:- Обычная функция: Имеет собственный объект
arguments, содержащий переданные аргументы. - Стрелочная функция: Не имеет собственного объекта
arguments, доступ к аргументам осуществляется через rest-параметры (...args).
- Обычная функция: Имеет собственный объект
- Именованные функции:
- Обычная функция: Может быть именованной (
function myFunction() { ... }). - Стрелочная функция: Анонимна по умолчанию, присваивается переменной для именования (
const myFunction = () => { ... }).
- Обычная функция: Может быть именованной (
- 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