Я бы ответил: наследование и полиморфизм. Пример наследования: в функции можно использовать внешние переменные. Полиморфизм: можно создать две функции или переменные с одинаковыми именами, но с разными областями видимости
Замыкания сами по себе не реализуют никакой принцип. Это просто один из механизмов языка.
Но если вопрос на самом деле звучал как "Какой принцип ООП обычно реализуется с помощью замыканий" - то ответ: инкапсуляция.
Дело в том, что в JS нет модификаторов доступа - аналогов private / public / protected из C++/C#/Java.
На Java/C# модификаторы доступа позволяют скрыть то, как именно класс хранит данные - например, скрыть факт, что возраст пользователя хранится в поле _age - достаточно просто поставить на поле private, и добавить методы getAge / setAge, через которые можно контролировать процесс установки возраста.
На JavaScript нельзя скрыть детали реализации - т.е. в ваше поле _age снаружи может влезть любой желающий, в обход getAge / setAge.
Стаднартное решение - вместо поля использовать локальную переменную, и использовать замыкание на нее в методах getAge / setAge. Эта переменная не будет видна снаружи (т.к. это локальная переменная в методе, не поле объекта).
function User (name, age) {
this.name = name; // видна снаружи
var _age = age; // не видна снаружи
this.getAge = function() {
return _age;
}
this.setAge = function(age) {
if(typeof age === "number" && age >0 && age<110){
_age = age;
} else {
console.log("Недопустимое значение");
}
}
}
Код взят с metanit, https://metanit.com/web/javascript/4.7.php
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости