我有这段代码来计算一些文本的宽度:
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
如何工作的,我得到了那部分。我只是想知道,出于某种原因,将宽度存储在变量中,进行清理,然后返回变量是否会更好?
当try块返回一些东西时,最后在内部进行清理是不是很糟糕的做法?
不,这是很正常的练习。
当您执行返回span.offsetwidth
时,将计算span.offsetwidth
的值并将其放在一边,然后运行finally
代码,然后返回该值。不需要手动操作。您的finally
甚至可以在其中包含span=null;
,并且这不会影响您的返回值,因为表达式span.offsetwidth
在此时已经计算过。
您可以在规范中看到:
运行时语义:评估
returnStatement:return
表达式;
在该节选中,值在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显示一个错误。如果我将函数返回类型声明为并使用语句它工作正常。那么,如上所述,当返回类型更改为时,为什么会发生此错误呢? 在返回类型不是的函数中,是否需要每个都有一个?