Files
frontend-docs/docs/javascript/functions/04-arrow-func.md
2025-02-27 16:37:59 +03:00

60 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
sidebar_position: 4
---
# Стрелочные функции
Существует ещё один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression.
```js
let sum = (a, b) => a + b;
```
## У стрелочных функций нет «this»
Если происходит обращение к this, его значение берётся снаружи.
❗ ***Стрелочные функции нельзя использовать с new***
> Отсутствие this естественным образом ведёт к другому ограничению: стрелочные функции не могут быть использованы как конструкторы. Они не могут быть вызваны с new.
Стрелочные функции VS bind
Существует тонкая разница между стрелочной функцией => и обычной функцией, вызванной с .bind(this):
- .bind(this) создаёт «связанную версию» функции.
- Стрелка => ничего не привязывает. У функции просто нет this. При получении значения this оно, как обычная переменная, берётся из внешнего лексического окружения.
## Стрелочные функции не имеют «arguments»
Это отлично подходит для декораторов, когда нам нужно пробросить вызов с текущими this и arguments.
```js
function defer(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms)
};
}
function sayHi(who) {
alert('Hello, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // выводит "Hello, John" через 2 секунды`
```
То же самое без стрелочной функции выглядело бы так:
```js
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
```
#### Стрелочные функции:
- Не имеют this.
- Не имеют arguments.
- Не могут быть вызваны с new.
- У них также нет super.