add js-base, functions
This commit is contained in:
45
docs/javascript/functions/01-intro.md
Normal file
45
docs/javascript/functions/01-intro.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Введение
|
||||
|
||||
#### Function Declaration: функция в основном потоке кода
|
||||
```
|
||||
function sum(a, b) {
|
||||
let result = a + b;
|
||||
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
#### Function Expression: функция как часть выражения
|
||||
```
|
||||
let sum = function(a, b) {
|
||||
let result = a + b;
|
||||
|
||||
return result;
|
||||
};
|
||||
```
|
||||
|
||||
#### Стрелочные функции:
|
||||
```
|
||||
// выражение в правой части
|
||||
let sum = (a, b) => a + b;
|
||||
|
||||
// многострочный код в фигурных скобках { ... }, здесь нужен return:
|
||||
let sum = (a, b) => {
|
||||
// ...
|
||||
return a + b;
|
||||
}
|
||||
|
||||
// без аргументов
|
||||
let sayHi = () => alert("Привет");
|
||||
|
||||
// с одним аргументом
|
||||
let double = n => n * 2;
|
||||
```
|
||||
|
||||
- У функций могут быть локальные переменные: т.е. объявленные в теле функции. Такие переменные видимы только внутри функции.
|
||||
- У параметров могут быть значения по умолчанию: function sum(a = 1, b = 2) \{...\}.
|
||||
- Функции всегда что-нибудь возвращают. Если нет оператора return, результатом будет undefined.
|
||||
39
docs/javascript/functions/02-func-declaration.md
Normal file
39
docs/javascript/functions/02-func-declaration.md
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Function Declaration
|
||||
|
||||
Function Declaration (Объявление Функции):
|
||||
```
|
||||
function имя(параметры, через, запятую) {
|
||||
...тело, код функции...
|
||||
}
|
||||
```
|
||||
Переменные, объявленные внутри функции, видны только внутри этой функции.
|
||||
|
||||
Функция обладает полным доступом к внешним переменным и может изменять их значение.
|
||||
|
||||
#### 💥 Глобальные переменные
|
||||
> Переменные, объявленные снаружи всех функций, называются глобальными.
|
||||
>
|
||||
> Глобальные переменные видимы для любой функции (если только их не перекрывают одноимённые локальные переменные).
|
||||
>
|
||||
> Желательно сводить использование глобальных переменных к минимуму. В современном коде обычно мало или совсем нет глобальных переменных. Хотя они иногда полезны для хранения важнейших «общепроектовых» данных.
|
||||
|
||||
#### Параметры
|
||||
Мы можем передать внутрь функции любую информацию, используя параметры.
|
||||
Значение, передаваемое в качестве параметра функции, также называется аргументом.
|
||||
|
||||
Другими словами:
|
||||
|
||||
- **Параметр** – это переменная, указанная в круглых скобках в объявлении функции.
|
||||
- **Аргумент** – это значение, которое передаётся функции при её вызове.
|
||||
|
||||
Если при вызове функции аргумент не был указан, то его значением становится **undefined**.
|
||||
|
||||
Функция может вернуть результат, который будет передан в вызвавший её код c помощью **return**\
|
||||
Возможно использовать **return** и без значения. Это приведёт к немедленному выходу из функции.
|
||||
|
||||
❗ ***Результат функции с пустым return или без него – undefined*** \
|
||||
❌ Никогда не добавляйте перевод строки между return и его значением
|
||||
81
docs/javascript/functions/03-func-expression.md
Normal file
81
docs/javascript/functions/03-func-expression.md
Normal file
@@ -0,0 +1,81 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Function Expression
|
||||
|
||||
**Function Declaration (Объявление Функции):**
|
||||
|
||||
```
|
||||
function sayHi() {
|
||||
alert( "Привет" );
|
||||
}
|
||||
```
|
||||
|
||||
**Function Expression (Функциональное Выражение).**
|
||||
|
||||
```
|
||||
let sayHi = function() {
|
||||
alert( "Привет" );
|
||||
};
|
||||
```
|
||||
|
||||
## Функция – это значение
|
||||
|
||||
Давайте повторим: независимо от того, как создаётся функция – она является значением. В обоих приведённых выше примерах
|
||||
функция хранится в переменной sayHi.
|
||||
|
||||
```
|
||||
function sayHi() {
|
||||
alert( "Привет" );
|
||||
}
|
||||
|
||||
alert( sayHi ); // выведет код функции
|
||||
```
|
||||
|
||||
## Функции-«колбэки»
|
||||
|
||||
Ключевая идея в том, что мы передаём функцию и ожидаем, что она вызовется обратно (от англ. «call back» – обратный
|
||||
вызов) когда-нибудь позже, если это будет необходимо.
|
||||
|
||||
## Function Expression в сравнении с Function Declaration
|
||||
|
||||
- Function Declaration: функция объявляется отдельной конструкцией «function…» в основном потоке кода.
|
||||
- Function Expression: функция, созданная внутри другого выражения или синтаксической конструкции. В данном случае
|
||||
функция создаётся в правой части «выражения присваивания» **=**
|
||||
|
||||
#### 💥 Более тонкое отличие состоит в том, когда создаётся функция движком JavaScript.
|
||||
|
||||
***Function Declaration может быть вызвана раньше, чем она объявлена.***
|
||||
|
||||
```
|
||||
sayHi("Вася"); // Привет, Вася
|
||||
|
||||
function sayHi(name) {
|
||||
alert( `Привет, ${name}` );
|
||||
}
|
||||
```
|
||||
|
||||
***Function Expression создаётся, когда выполнение доходит до него, и затем уже может использоваться.***
|
||||
```
|
||||
sayHi("Вася"); // ошибка!
|
||||
|
||||
let sayHi = function(name) { // (*) магии больше нет
|
||||
alert( `Привет, ${name}` );
|
||||
};
|
||||
```
|
||||
|
||||
Ещё одна важная особенность Function Declaration заключается в их блочной области видимости.
|
||||
|
||||
В строгом режиме, когда Function Declaration находится в блоке \{...\}, функция доступна везде внутри блока. Но не
|
||||
снаружи него.
|
||||
|
||||
- Функции – это значения. Они могут быть присвоены, скопированы или объявлены в любом месте кода.
|
||||
- Если функция объявлена как отдельная инструкция в основном потоке кода, то это “Function Declaration”.
|
||||
- Если функция была создана как часть выражения, то это “Function Expression”.
|
||||
- Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке.
|
||||
- Функции, объявленные при помощи Function Expression, создаются только когда поток выполнения достигает их.
|
||||
|
||||
В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, т.к функция будет видна
|
||||
до своего объявления в коде. Это даёт нам больше гибкости в организации кода, и, как правило, делает его более
|
||||
читабельным.
|
||||
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.
|
||||
7
docs/javascript/functions/_category_.json
Normal file
7
docs/javascript/functions/_category_.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "Работа с функциями",
|
||||
"position": 4,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user