add js-base, functions

This commit is contained in:
2025-02-27 15:52:06 +03:00
parent e8fe7c6f0c
commit 698358afaf
33 changed files with 710 additions and 3 deletions

View 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.

View File

@@ -0,0 +1,39 @@
---
sidebar_position: 2
---
# Function Declaration
Function Declaration (Объявление Функции):
```
function имя(параметры, через, запятую) {
...тело, код функции...
}
```
Переменные, объявленные внутри функции, видны только внутри этой функции.
Функция обладает полным доступом к внешним переменным и может изменять их значение.
#### 💥 Глобальные переменные
> Переменные, объявленные снаружи всех функций, называются глобальными.
>
> Глобальные переменные видимы для любой функции (если только их не перекрывают одноимённые локальные переменные).
>
> Желательно сводить использование глобальных переменных к минимуму. В современном коде обычно мало или совсем нет глобальных переменных. Хотя они иногда полезны для хранения важнейших «общепроектовых» данных.
#### Параметры
Мы можем передать внутрь функции любую информацию, используя параметры.
Значение, передаваемое в качестве параметра функции, также называется аргументом.
Другими словами:
- **Параметр** это переменная, указанная в круглых скобках в объявлении функции.
- **Аргумент** это значение, которое передаётся функции при её вызове.
Если при вызове функции аргумент не был указан, то его значением становится **undefined**.
Функция может вернуть результат, который будет передан в вызвавший её код c помощью **return**\
Возможно использовать **return** и без значения. Это приведёт к немедленному выходу из функции.
***Результат функции с пустым return или без него undefined*** \
❌ Никогда не добавляйте перевод строки между return и его значением

View 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 предпочтительнее, т.к функция будет видна
до своего объявления в коде. Это даёт нам больше гибкости в организации кода, и, как правило, делает его более
читабельным.

View 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.

View File

@@ -0,0 +1,7 @@
{
"label": "Работа с функциями",
"position": 4,
"link": {
"type": "generated-index"
}
}