Javascript 最后在试块内做清理,用回试块-不好的做法?

Javascript 最后在试块内做清理,用回试块-不好的做法?,javascript,try-finally,Javascript,Try Finally,我有以下代码来计算一些文本的宽度: function textWidth(text, font) { const span = document.createElement('span') try { span.style.cssText = `position: absolute; opacity: 0; font: ${font || "'Arial'"};` span.innerText = text document.bod

我有以下代码来计算一些文本的宽度:

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块返回某些内容时,最后在内部进行清理是否是一种不好的做法

不,这是完全正常的做法

当您返回span.offsetWidth时,将计算
span.offsetWidth
的值并将其放在一边,然后运行
最后的
代码,然后返回该值。不需要手动操作。您的
最终
甚至可能有
span=nullspan.offsetWidth
已在该点上求值

您可以从以下内容中看到:

运行时语义:评估

ReturnStatement:
return
表达式

  • 让exprRef作为计算表达式的结果
  • 让EXPREVALUE是什么?获取值(exprRef)
  • 如果!GetGeneratorKind()是异步的,是否将exprValue设置为?等待(导出值)
  • 返回完成{[[Type]]:返回,[[Value]]:exprValue,[[Target]]:empty}
  • 在该摘录中,值位于
    exprValue
    ,它成为完成记录的一部分(这是一种规范机制,不一定是真实的);然后运行
    finally
    代码,函数使用该完成记录完成(当然,除非
    finally
    抛出或发出一个不同的
    return
    ,该
    return

    你也可以观察它:

    函数示例(){
    让foo=()=>{
    log(“foo调用”);
    返回42;
    };
    试一试{
    log(“Doing:return foo();”;
    返回foo();
    }最后{
    log(“finally block,doing foo=null”);
    foo=null;
    }
    }
    log(示例())