Возьмем эту примерную функцию
async function foo () {
const res = await fetchData()
const out = await processData(res)
return out
}
Представьте, что я заметил, что fetchData
работает медленно, и я хочу быстро профилировать с помощью общей функции/генератора таймера:
async function foo () {
for (let time of timer()) {
const res = await fetchData()
}
const out = await processData(res) // error res is undefined
return out
}
Теперь это ломает код, так как res
больше не определено. Я мог бы определить let res
перед блоком или использовать var
, но это означает изменение исходного кода для некоторого временного кода профилирования. Я предполагаю, что именно в этом заключается смысл const
в том, что переход к заявления. Тем не менее, я все еще чувствую, что есть способ сохранить объем и вызвать событие до и после набора строк?
Я не женат на генераторах. Замыкания могут выполнять ту же работу, но иметь ту же проблему с областью действия. Другие предложения по синтаксису приветствуются.
Как я могу обернуть произвольный блок кода, но сохранить переменную область видимости? Может быть, с прокси? Что-то похожее на контекстные менеджеры из python. Это может быть на грани ограничений языка?
let
или использоватьvar
). Если вы перемещаете объявлениеlet
илиconst
внутрь блока, вы сужаете его область действия только до этого блока. Обойти это невозможно - это определение языка. Обернув его в блок, вы сузили область переменных, определенных в этом блоке, с помощьюconst
илиlet
. Обойти это без изменения кода внутри блока невозможно. - person jfriend00   schedule 02.02.2018var
, но я предполагаю, что должны быть различные параметры профилирования, которые не требуют каких-либо изменений кода. - person Slai   schedule 02.02.2018