VAR | LET | CONST
Все это способы объявить переменные в JS, но имеют отличия в работе.
Для начала let и const
при попытке эту переменную переопределить, у тебя просто напросто выскочит ошибка,
НО объекты (в т.ч. массивы), объявленные таким образом, менять можно - об этом позже в отдельном посте
Переменные, объявленные таким образом видны только в своем блоке фигурных скобок
#JS #Junior #переменные
Все это способы объявить переменные в JS, но имеют отличия в работе.
Для начала let и const
let
- используй для переменных, которые будут менятьсяconst
- для неизменяемых переменных при попытке эту переменную переопределить, у тебя просто напросто выскочит ошибка,
НО объекты (в т.ч. массивы), объявленные таким образом, менять можно - об этом позже в отдельном посте
Переменные, объявленные таким образом видны только в своем блоке фигурных скобок
{}
let a = 13
{
let a = 12
const b = 34
console.log(a) // 12
console.log(b) // 34
}
console.log(a) // 13
console.log(b) // выдаст ошибку ReferenceError: b is not defined
#JS #Junior #переменные
Немного про VAR
Все советуют забыть этот способ объявления как страшный сон и я соглашусь,
но важно понимать как это работает, если столкнешься с legacy, пишешь код для очень древних браузеров (или ты просто любопытный)
Основное отличие от
И фигурные скобки для нее не преграда
В примере выше, через повторное объявление a мы на самом деле нашли старую в текущей функции
(а т.к. функцию мы не объявляли, то в глобальном объекте - window)
и записали в нее новое значение
——
❕можно случайно переопределить переменную, объявленную ранее в коде
❕создает путаницу при чтении кода, т.к. допустимо сначала переменную использовать, а потом объявить
Если вдруг по какой то причине вы решили, что вам нужна переменная, которая видна во всей функции, а не только в блоке
#JS #Junior #переменные
Все советуют забыть этот способ объявления как страшный сон и я соглашусь,
но важно понимать как это работает, если столкнешься с legacy, пишешь код для очень древних браузеров (или ты просто любопытный)
Основное отличие от
let/const
- переменная, объявленная через var видна во всей функции, в которой была объявленаИ фигурные скобки для нее не преграда
var a = 13
{
var a = 12
var b = 34
console.log(a) // 12
console.log(b) // 34
}
console.log(a) // 12
console.log(b) // 34
В примере выше, через повторное объявление a мы на самом деле нашли старую в текущей функции
(а т.к. функцию мы не объявляли, то в глобальном объекте - window)
и записали в нее новое значение
——
var
- считается устаревшим и неудобным способом объявления переменных, т.к.❕можно случайно переопределить переменную, объявленную ранее в коде
❕создает путаницу при чтении кода, т.к. допустимо сначала переменную использовать, а потом объявить
console.log(a) // сработает и выведет undefined
var a = 10
Если вдруг по какой то причине вы решили, что вам нужна переменная, которая видна во всей функции, а не только в блоке
{}
- просто объявляете let/const
в начале вашей функции - багов меньше, код читабельнее#JS #Junior #переменные
Сегодня хочу зафиксировать тему про лексические окружения (лексическую область видимости)
📌 В JavaScript область видимости определяется на этапе написания кода, а не выполнения.
➡️ ты пишешь код
➡️ движок JS сразу запоминает, где написана каждая функция,
и какие переменные она может видеть — ещё до того, как ты её запустишь.
JS не будет потом «думать» в момент вызова функции — он уже заранее знает:
👉 «эта функция была написана вот тут, значит, она может видеть только вот такие переменные»
Что это значит на практике?
Где ты написал функцию — важнее, чем откуда ты её вызвал.
Это напрямую влияет на то, какие переменные функция будет видеть.
✅ Функция
🚫 А вот пример — не работает:
Хотя мы вызываем
потому что
——
⚠️ Основное и самое главное, что нужно запомнить:
неважно ГДЕ и КАК вызвана функция, ее лексическая область видимости определяется только тем ГДЕ она была объявлена
#JS #Junior #область_видимости
📌 В JavaScript область видимости определяется на этапе написания кода, а не выполнения.
➡️ ты пишешь код
➡️ движок JS сразу запоминает, где написана каждая функция,
и какие переменные она может видеть — ещё до того, как ты её запустишь.
JS не будет потом «думать» в момент вызова функции — он уже заранее знает:
👉 «эта функция была написана вот тут, значит, она может видеть только вот такие переменные»
Что это значит на практике?
Где ты написал функцию — важнее, чем откуда ты её вызвал.
Это напрямую влияет на то, какие переменные функция будет видеть.
let name = "Валерка";
function sayHi() {
console.log("Привет, " + name);
}
sayHi(); // Привет, Валерка
✅ Функция
sayHi
написана рядом с name
, значит она его "видит".🚫 А вот пример — не работает:
function sayHi() {
console.log("Привет, " + name);
}
function run() {
let name = "Валера";
sayHi();
}
run(); // ReferenceError: name is not defined
Хотя мы вызываем
sayHi
внутри функции, где есть переменная name
, она не сработает —потому что
sayHi
была написана вне этой функции и не видит name.——
⚠️ Основное и самое главное, что нужно запомнить:
неважно ГДЕ и КАК вызвана функция, ее лексическая область видимости определяется только тем ГДЕ она была объявлена
#JS #Junior #область_видимости
Замыкания - такой ли страшный зверь?
Если ты разобрался с лексической областью видимости, то замыкания будут тебе понятны, если нет ... читай про лексическое окружение :)
Звучит занудно и непонятно? Да, бывает
На практике это означает, что
любая функция, которая передана как значение и вызванная где то в другой точке программы - пример замыкания
Такие функции сохраняют ссылку на то место, где были созданы и имеют доступ к переменным внутри этой области
————
💛 Пример из реальной жизни, где реализовано и используется замыкание:
Что тут происходит?
1️⃣
2️⃣ Возвращается внутренняя функция, которая помнит
3️⃣ Каждый вызов
———
Еще один пример:
Это уже немного React.js, но все таки по теме
Что происходит и где тут замыкание?
Стрелочная функция внутри
Эта функция вызовется не скоро и явно вне того места, где была объявлена, но она хранит ссылку на место объявления и "видит" переменную
———
❇️ Финализируем..
Замыкание - способность функции хранить память о том месте, где она была создана и иметь доступ к переменным и функциям в той области видимости.
#JS #Junior #область_видимости #замыкания
Если ты разобрался с лексической областью видимости, то замыкания будут тебе понятны, если нет ... читай про лексическое окружение :)
Определение замыкания вообще звучит следующим образом:
способность функции запоминать свою лексическую область видимости и обращаться к ней даже тогда, когда функция выполняется вне своей лексической области видимости.
Звучит занудно и непонятно? Да, бывает
На практике это означает, что
любая функция, которая передана как значение и вызванная где то в другой точке программы - пример замыкания
Такие функции сохраняют ссылку на то место, где были созданы и имеют доступ к переменным внутри этой области
————
💛 Пример из реальной жизни, где реализовано и используется замыкание:
function createCounter() {
let count = 0;
return function () {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
Что тут происходит?
1️⃣
createCounter
запускается → внутри создаётся count = 0.2️⃣ Возвращается внутренняя функция, которая помнит
count
, даже когда createCounter уже завершился.3️⃣ Каждый вызов
counter()
увеличивает и возвращает count
.———
Еще один пример:
import { useEffect, useState } from "react";
function Timer() {
const [message, setMessage] = useState("Ждём...");
useEffect(() => {
const name = "Валерка";
setTimeout(() => {
setMessage(`Привет, ${name}`);
}, 3000);
}, []);
return <p>{message}</p>;
}
Это уже немного React.js, но все таки по теме
Что происходит и где тут замыкание?
Стрелочная функция внутри
setTimeout
- классический пример замыкания. Эта функция вызовется не скоро и явно вне того места, где была объявлена, но она хранит ссылку на место объявления и "видит" переменную
name
———
❇️ Финализируем..
Замыкание - способность функции хранить память о том месте, где она была создана и иметь доступ к переменным и функциям в той области видимости.
#JS #Junior #область_видимости #замыкания
THIS
Конструкция не самая популярная, но важная, если хочешь не просто писать код, а понимать как он работает, НО
Наверняка (хотя мб и нет, если твой код в основном на стрелочных функциях и функциональных объектах)
в своей практике ты сталкивался с тем, что функция что-то пытается вытащить из this:
Сегодня хочу разобрать на что этот объект ссылается и чем это точно не является
————
Чем THIS не является:
🔸 Это НЕ ссылка функции на саму себя
🔸 Это НЕ указатель на лексическую область видимости функции
Тогда что же такое THIS и куда оно нас отошлет при вызове?
Когда функция вызывается — создается "контекст выполнения" (execution context).
В нем формируется ссылка this, основываясь на том, как именно была вызвана функция.
Определяем, на что эта ссылка указывает
📖 Хочешь понять тему глубже?
Вот глава из YDKJS на русском
Тема очень обширная и вставлять примеры кода не буду, т.к. пост разрастется до огромных масштабов, но все это есть в статье по ссылке выше
--------
⚠️ this требует внимания — особенно при передаче функций или колбэков. Но он может избавить от громоздких конструкций и сделать код элегантнее
——
🧠 Про стрелочные функции, а также разницу между bind, call и apply — расскажу в отдельных постах.
#JS #Middle #this
Конструкция не самая популярная, но важная, если хочешь не просто писать код, а понимать как он работает, НО
Для начала, если тыА теперь к теории...)
▫️ пишешь на React, это тебе нужно только для общего понимания как работает язык
▫️ пишешь на ReactNative, то аналогично с фронтендом
🔺 пишешь бекенд, особенно используя Express, TypeORM, Sequelize - это стоит понимать
Наверняка (хотя мб и нет, если твой код в основном на стрелочных функциях и функциональных объектах)
в своей практике ты сталкивался с тем, что функция что-то пытается вытащить из this:
const settings = {
mode: "dark",
logMode() {
console.log(`Режим: ${this.mode}`);
},
};
settings.logMode(); // Режим: dark
Сегодня хочу разобрать на что этот объект ссылается и чем это точно не является
————
Чем THIS не является:
🔸 Это НЕ ссылка функции на саму себя
🔸 Это НЕ указатель на лексическую область видимости функции
Тогда что же такое THIS и куда оно нас отошлет при вызове?
this определяется не во время написания кода, а в момент вызова функции.
Когда функция вызывается — создается "контекст выполнения" (execution context).
В нем формируется ссылка this, основываясь на том, как именно была вызвана функция.
Определяем, на что эта ссылка указывает
4 правила определения this (из книги YDKJS):
1️⃣ new — создается новый объект → this = новый объект
2️⃣ call, apply, bind — this = переданный объект
3️⃣ Вызов через объект — this = сам объект
4️⃣ По умолчанию — this = undefined (в strict) или global (в обычном режиме)
📖 Хочешь понять тему глубже?
Вот глава из YDKJS на русском
Тема очень обширная и вставлять примеры кода не буду, т.к. пост разрастется до огромных масштабов, но все это есть в статье по ссылке выше
--------
⚠️ this требует внимания — особенно при передаче функций или колбэков. Но он может избавить от громоздких конструкций и сделать код элегантнее
——
🧠 Про стрелочные функции, а также разницу между bind, call и apply — расскажу в отдельных постах.
#JS #Middle #this