全局范围或重复函数中的常量变量
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
现在处于“闭包”状态,您唯一暴露的是内部函数。
我正在使用 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
现在处于“闭包”状态,您唯一暴露的是内部函数。