全局范围或重复函数中的常量变量

Constant variable in global scope or in repeated function

我正在使用 Three.js 构建一个虚拟 space,集成 3D 资产和空间声音,因此它可能对性能具有相当大的挑战性。我有一个在每一帧(每 1/60 秒)调用的函数,我想知道将常量变量放在哪里,以使其花费尽可能少的资源。

我想我最好把它放在全局范围内,这样它就不会在每一帧都被重新赋值。但是我知道我应该尽可能避免“污染”全局范围,并且这个变量只在给定的函数中是必需的。

所以,我应该把它放在全局范围内,从而污染它一点吗?每次重新分配它并从全局范围读取它在性能方面是否相同?

这是提供一些见解的函数,常量变量是 EASING_FACTOR :

function easeTransition(current, old) {
  const EASING_FACTOR = 100;
  let result = {};
  for (const arg in current) {
    const diff = current[arg] - old[arg];
    result[arg] = old[arg] + diff / EASING_FACTOR;
  }

  return result;
}

谢谢!

const EASING_FACTOR = 100;
const EASING_FACTOR_INVERSE = 1/EASING_FACTOR

function easeTransition(current, old) {
  let result = {};
  for (const arg in current) {
    const diff = current[arg] - old[arg];
    result[arg] = old[arg] + diff * EASING_FACTOR_INVERSE;
  }

  return result;
}

除法比乘法慢,因此计算一次逆然后执行数千次乘法而不是除法是有意义的。

其他模式应该可以帮助您避免污染全局范围。我实际上不确定这里的术语(什么样的模块等)但是如果这段代码在一个文件中,你只会导出 easeTransition 函数,因此你的常量实际上不会是全局的。

如果您想“手动”尝试这个,您可以使用 IIFE:

const easeTransition = (function(){
  const EASING_FACTOR = 100;
  return function _easeTransition(current, old) {
    let result = {};
    for (const arg in current) {
      const diff = current[arg] - old[arg];
      result[arg] = old[arg] + diff / EASING_FACTOR;
    }
    return result;
  }
})() //<- this invokes it "immediately" 

const EASING_FACTOR 现在处于“闭包”状态,您唯一暴露的是内部函数。