JavaScript кажется простым до первого серьёзного проекта. Потом внезапно появляются «магические» баги, странное поведение this, гонки в асинхронном коде и утечки памяти.
Разберём 5 механизмов языка, которые обязательно нужно понимать, если вы пишете что-то сложнее лендинга.
Замыкания — фундамент JS. Но их побочный эффект — удержание ссылок в памяти.
function createHeavyObject() {
const bigData = new Array(1_000_000).fill("data");
return function () {
console.log("Working...");
};
}
const fn = createHeavyObject();
Даже если bigData не используется во внутренней функции, оно останется в памяти, пока существует fn.
Практика: освобождать ссылки, аккуратно работать с глобальными кэшами, не хранить лишнее в замыканиях.
this — зависит от способа вызова, а не от места объявленияВ JS this определяется во время вызова.
const user = {
name: "Dmitriy",
greet() {
console.log(this.name);
}
};
const greet = user.greet;
greet(); // undefined
Контекст потерян.
this зависит от вызова.this берётся из внешнего окружения.bind, call, apply управляют контекстом вручную.В React-классах, обработчиках DOM, старом Node-коде — это классический источник багов.
Большинство разработчиков знают, что JS однопоточный. Но не все понимают порядок выполнения.
console.log("1");
setTimeout(() => console.log("2"));
Promise.resolve().then(() => console.log("3"));
console.log("4");
Результат:
1
4
3
2
Почему?
setTimeout).Если не понимаете очереди задач — дебажить будет больно.
class в JS — синтаксический сахар.
class User {
constructor(name) {
this.name = name;
}
greet() {
return `Hi, ${this.name}`;
}
}
Под капотом:
User.prototype.greet = function() { ... }
__proto__ могут ломать оптимизации движка.В производительности это имеет значение.
JS агрессивно приводит типы.
[] + [] // ""
[] + {} // "[object Object]"
{} + [] // 0 (в зависимости от контекста)
Самый известный пример:
[] == false // true
Алгоритм сравнения == сложный и неинтуитивный.
===JavaScript не сложный. Он неочевидный.
Если вы:
this,ваш код становится предсказуемым.
А предсказуемость — это и есть профессиональная разработка.