我最近阅读了《高性能 JavaScript》(2010),其中指出:
标识符存在于执行上下文的作用域链中越深,读取和写入的访问速度就越慢。因此,局部变量总是在函数内部访问最快的,而全局变量通常是最慢的。请记住,全局变量始终存在于执行上下文作用域链的最后一个变量对象中,因此它们始终距离解析最远。
考虑到过去十年 JavaScript 引擎的大幅优化,我想知道这个说法在 2024 年是否仍然准确?
let globalVar = 0;
function testVariables() {
let localVar = 0;
let globalStartTime = performance.now();
for (let i = 0; i < 5000000; i++) {
globalVar += 1;
}
let globalEndTime = performance.now();
let localStartTime = performance.now();
for (let i = 0; i < 5000000; i++) {
localVar += 1;
}
let localEndTime = performance.now();
console.log(`Global variable access time: ${globalEndTime - globalStartTime} ms`);
console.log(`Local variable access time: ${localEndTime - localStartTime} ms`);
}
testVariables();
输出为: 全局变量访问时间:25.80000001192093 ms 局部变量访问时间:11.400000035762787 ms
全局变量的访问时间肯定比局部变量要长,但我仍然不确定作用域链遍历是否是其背后的主要原因。或许还有其他原因?
我认为另一个原因是,如果全局命名空间中有变量,那么外部可以更改该变量,并且它将强制解释器每次通过循环重新加载该值。 因此使其比局部变量慢