add js-base, functions
This commit is contained in:
58
docs/javascript/functions/04-arrow-func.md
Normal file
58
docs/javascript/functions/04-arrow-func.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Стрелочные функции
|
||||
|
||||
Существует ещё один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression.
|
||||
|
||||
``` let sum = (a, b) => a + b;```
|
||||
|
||||
## У стрелочных функций нет «this»
|
||||
Если происходит обращение к this, его значение берётся снаружи.
|
||||
|
||||
❗ ***Стрелочные функции нельзя использовать с new***
|
||||
> Отсутствие this естественным образом ведёт к другому ограничению: стрелочные функции не могут быть использованы как конструкторы. Они не могут быть вызваны с new.
|
||||
|
||||
Стрелочные функции VS bind
|
||||
Существует тонкая разница между стрелочной функцией => и обычной функцией, вызванной с .bind(this):
|
||||
|
||||
- .bind(this) создаёт «связанную версию» функции.
|
||||
- Стрелка => ничего не привязывает. У функции просто нет this. При получении значения this – оно, как обычная переменная, берётся из внешнего лексического окружения.
|
||||
|
||||
## Стрелочные функции не имеют «arguments»
|
||||
|
||||
Это отлично подходит для декораторов, когда нам нужно пробросить вызов с текущими this и arguments.
|
||||
```
|
||||
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 секунды`
|
||||
```
|
||||
|
||||
То же самое без стрелочной функции выглядело бы так:
|
||||
|
||||
```
|
||||
function defer(f, ms) {
|
||||
return function(...args) {
|
||||
let ctx = this;
|
||||
setTimeout(function() {
|
||||
return f.apply(ctx, args);
|
||||
}, ms);
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
#### Стрелочные функции:
|
||||
- Не имеют this.
|
||||
- Не имеют arguments.
|
||||
- Не могут быть вызваны с new.
|
||||
- У них также нет super.
|
||||
Reference in New Issue
Block a user