是否可以在块或闭包之外共享常量范围



>以这个例子函数为例

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 的上下文管理器。这可能处于语言局限性的边缘?

你怎么看这样的事情?

async function timed(p) {
  const start = performance.now();
  const res = await p();
  const end = performance.now();
  console.log('time elapsed', end - start);
  return res;
}
async function foo () {
  const res = await timed(fetchData);
  const out = await processData(res);
  return out
}
<</div> div class="one_answers">我不知道

">使用通用计时器函数/生成器快速分析fetchData"是什么意思。我所能看到的是您将语句移动到一个循环中,显然它可能被多次执行或根本不执行,因此您无法轻松地将一个结果值分配给外部范围的res变量。

如果你想对某些数据结构使用循环,是的,只需使用 let res 并从循环中获取最后一个值(或者在循环体未运行的情况下获取初始值(。

如果要分析fetchData函数,请查看如何测量承诺的执行时间?。

最新更新