Javascript引擎是否提前看到常量变量?

Does Javascript engine see constant variables in advance?

考虑这段代码

function getPow() {
    const a = 2
    return Math.pow(2, a)
}

如果 a 是一个常量,并且除了 pow 函数之外没有其他任何东西使用它,javascript 引擎是否会提前计算(创建阶段)并将结果放入在 return 中还是函数每次调用时都会进行计算?

所有引擎(V8、SpiderMonkey 等)都一样吗?

如果您希望在函数调用之外预先计算数学表达式的一部分,您可以这样做:

const a = 2;

const myPow = Math.pow(2, a);

function getPow() {
  return myPow;
}

或者,如果您希望将计算的 运行 延迟到第一次调用时,您可以使用如下方法:

const a = 2;

let _myPow;

function myPow() {
  if (_myPow === undefined) {
     _myPow = Math.pow(2, a);
  }
  return _myPow;
}

function getPow() {
  return myPow();
}

是的,V8 的优化编译器支持“常量折叠”(即在编译时输入已知时在编译时执行计算),并且此优化确实触发了问题中的示例。

const a是否用于其他用途并不重要。

虽然所有引擎都可能这样做,但这也是一个内部实现细节,我不建议依赖它(在任何引擎中)。在大多数情况下,这也不应该很重要。