当前位置: 首页 > 知识库问答 >
问题:

在最后一个块内做清理,并在尝试块内返回--不好的做法?

越涛
2023-03-14

我有这段代码来计算一些文本的宽度:

function textWidth(text, font) {
    const span = document.createElement('span')
    try {
        span.style.cssText = `position: absolute; opacity: 0; font: ${font || "'Arial'"};`
        span.innerText = text
        document.body.appendChild(span)

        return span.offsetWidth
    } finally {
        document.body.removeChild(span)
    }
}

当try块返回一些东西时,最后在内部进行清理是不是很糟糕的做法?它按预期工作;这个问题不是关于try...finally如何工作的,我得到了那部分。我只是想知道,出于某种原因,将宽度存储在变量中,进行清理,然后返回变量是否会更好?

共有1个答案

令狐良骏
2023-03-14

当try块返回一些东西时,最后在内部进行清理是不是很糟糕的做法?

不,这是很正常的练习。

当您执行返回span.offsetwidth时,将计算span.offsetwidth的值并将其放在一边,然后运行finally代码,然后返回该值。不需要手动操作。您的finally甚至可以在其中包含span=null;,并且这不会影响您的返回值,因为表达式span.offsetwidth在此时已经计算过。

您可以在规范中看到:

运行时语义:评估

returnStatement:return表达式;

  1. 让exprRef是计算表达式的结果。
  2. 让exprValue为?GetValue(exprRef)。
  3. 如果!GetGeneratorKind()是异步的,将exprValue设置为?等待(exprValue)。
  4. 返回完成{[[Type]]:返回,[[Value]]:exprValue,[[Target]]:空}。

在该节选中,值在exprvalue中,它成为完成记录的一部分(这是一种规范机制,不一定是真实的东西);然后运行finally代码,函数以该完成记录完成(当然,除非finally抛出或发出一个不同的return来取代该return)。

而且你也可以观察到:

js prettyprint-override">function example() {
  let foo = () => {
    console.log("foo called");
    return 42;
  };
  try {
    console.log("Doing: return foo();");
    return foo();
  } finally {
    console.log("finally block, doing foo = null");
    foo = null;
  }
}
console.log(example());
 类似资料:
  • 我很好奇在try块中使用return语句的最佳实践。 我有一个调用服务方法的方法,该方法返回一个整数,并可能抛出一个IllegalArgumentException。有两种方法可以做到这一点。 第一: 第二: 在第二种方法中,计数变量似乎是不必要的,但出于某种原因,第一种方法在我看来是错误的。有什么特别的理由偏袒一方而不是另一方吗?

  • 假设我有一个类来为游戏中的一个项目建模,如下所示: (假设正确重写的和以比较内部枚举) 现在我想要一种方法来用中的getter来区分这些项:我应该返回还是名称?一般情况下返回是好的做法吗?或者是否有更好的方法来区分这些s?因为返回枚举类似于向我公开rep,而且我不希望我的同事直接使用来比较的 我想到的办法如下: 执行类似; 要执行; ; 要执行; 我不知道该怎么做,我希望有经验的程序员能给我一些启

  • 问题内容: 我正在编写GC友好的代码,以读取并向用户返回一系列消息。在内部我重用相同的实例,这意味着我将在 大多数时候 重复返回同一实例。 我正在考虑编写警告性javadoc并将其作为暴露给用户。AFAIK不会违反合同,但是如果用户这样做并返回每个位置的填充物,用户肯定会感到惊讶! 问题:对于 可能会变异并返回相同对象* 以实现接口的类,这是 不好的做法 吗? * 如果是这样,最好的选择是什么?“

  • 我希望有一个的版本,它不对32个元素进行分块。当前,此代码将输出 有办法做到这一点吗?

  • 我有一个粒子模拟项目,我已经工作了很多个小时,我将发布两个类。一个是粒子类,一个是main和Canvas类。我创建一个画布,然后得到它的BufferStrategy和一个Graphics在上面绘制。我使用更新循环来更新每一帧的粒子,并使用渲染循环来渲染每一帧的粒子。更新和渲染都是通过调用粒子数组列表中每个粒子的自渲染和自更新方法来完成的。现在这是我的问题。我有一个MouseListener,它在中

  • 我正在写一个函数来计算两个数的最大公分母。我的函数的返回类型是,它的参数是两个s。代码还没有完成,但到目前为止它有两个块。 这是我的代码: IDE显示一个错误。如果我将函数返回类型声明为并使用语句它工作正常。那么,如上所述,当返回类型更改为时,为什么会发生此错误呢? 在返回类型不是的函数中,是否需要每个都有一个?