Comments 38
Уже везде есть глобальная переменная globalThis
.
Хорошо, окей, а если мне в блоке инициализации приложения нужно пользоваться async/await?
Пока что получается такая конструкция:
(async () => {
await someDatabaseInit()
await someCacheInit()
// ...
})()
someDatabaseInit().then(() => someCacheInit()).catch(() => ???)
Дельный комментарий на самом деле.
Не нужно забывать об обработке ошибок, await нужно обернуть в try/catch, и конструкция получается более громоздкой чем цепочка с .then/catch
обработку then
можно почти всегда опустить, а вот catch
все же нужен. В браузере вполне приемлемо использовать такую конструкцию и при желании можно прокинуть нормальный обработчик
window.onerror = e => {
// тут может оказаться нормальный обработчик
console.error(e)
}
(async () => {
// ...
throw new Error('catch me')
})().catch(onerror)</source>
Это не сработает. onerror
не будет ловить ошибки, которые возникают в цепочке промисов. Для этого нужно использовать window.onunhandledrejection
либо window.addEventListener("unhandledrejectuin", ...)
. FF начал поддерживать эти обработчики только в конце 2019 года, а Safari до сих пор не поддерживает 2-ой способ
Кстати, можно еще так:
const promise = (async () => {
await someDatabaseInit()
})()
promise.catch(console.error)
Использую асинхронные замыкания чаще всего в React-хуках.
async function init() {
await ...
}
init();
?
Уже Stage 3. Значит сделают.
github.com/tc39/proposal-top-level-await
Замыкания вызывают побочные эффекты, что…
каким образом?
Замыкание являются частью ФП. И не нарушает принципов ФП
переменная count является частью замыкания и не объявлена вне замыкания
Верно. Так же верно то что, переменная count объявлена снаружи функции, которую возвращает замыкание.
https://en.wikipedia.org/wiki/Side_effect_(computer_science)
Первый абзац:
function or expression is said to have a side effect if it modifies some state variable value(s) outside its local environment, that is to say has an observable effect besides returning a value (the main effect) to the invoker of the operation
В нашем фрагменте когда функция, которая возвращается замыканием, изменяет состояние (переменную count), которая объявлена все этой функции. Это называется побочным эффектом.
Или вот отсюда: Побочный эффект (программирование)
Если вызвать функцию с побочным эффектом дважды с одним и тем же набором значений входных аргументов, может случиться так, что в качестве результата будут возвращены разные значения.
Если вы вызовем функцию id() из нашего примера дважды (с одним и тем же набором аргументов; если быть точным не передавая никаких аргументов), то она вернёт нам разный результат. Это нарушает принцип ФП. Причиной является то, что функция id() имеет побочный эффект.
не нравится прототипное наследование, имеющее контекст только в виде самого объекта и вечного this, и не позволяющее собрать объект несколькими конструкторами и делать в него примеси или замены полей без всякой иерархии
А как бы вам нравилось чтобы это работало? Интересно понять как вы видите удачное решение этой задачи.
function FirstConstructor(){
const t = this;
let privateVar = 123;
t.publicMethod = val => privateVar + val; // никаких this для приватных полей
}
function SecondConstructor(){
const t = this;
let privateVar = 456; // приватные поля не пересекутся с родителем
delete t.publicMethod; // удаляем метод и его в объекте не будет нигде
t.anotherPublicMethod = ()=> privateVar; // никаких this для приватных полей
function privateMethod(){ return privateVar } // нет this для приватных полей
t.thirdPublicMethod = ()=> privateMethod() + 7; // нет this для прив. методов
}
let myInstance = new FirstConstructor();
SecondConstructor.call( myInstance );
В результате выходит экземпляр, у которого нет прототипов (кроме стандартного), всё на одном уровне, честные приватные поля, работающие без this.#, и удалённый метод. Есть конечно недостатки, и их не мало, но и преимущества есть.
Или например вычисление значения для ключа при написании объекта литералом.
Для этого напрашиваются template strings. Какие с ними могут быть нюансы?
let obj = {
myKey: (()=>{
if( !someCheck() ) return;
...
return result;
})
}
А где тут IIFE? Да и то сократить можно
let obj = {
myKey(){
if( !someCheck() ) return;
...
return result;
}
}
Если забыли добавить (). То это костыльный способ заменить do exressions
(function() {
if (something) {
return;
}
// ...
})();
Почему пора перестать использовать JavaScript IIFE